Пакет parallel — parSapply

Эффективный код на R

Colin Gillespie

Jumping Rivers & Newcastle University

Семейство apply

Существуют параллельные версии

  • apply()- parApply()
  • sapply()- parSapply()
    • применение функции к вектору, т.е. цикл for
  • lapply()- parLapply()
    • применение функции к списку
Эффективный код на R

Функция sapply()

sapply() — это просто другой способ записи цикла for

Цикл

for(i in 1:10)
    x[i] <- simulate(i)

Можно записать как

sapply(1:10, simulate)

Мы применяем функцию к каждому значению вектора

Эффективный код на R

Переход на parSapply()

Та же схема!

  1. Загрузить пакет
  2. Создать кластер
  3. Перейти на parSapply()
  4. Остановить!
Эффективный код на R

Пример: битвы покемонов

plot(pokemon$Defense, pokemon$Attack)
abline(lm(pokemon$Attack ~ pokemon$Defense), col = 2)
cor(pokemon$Attack, pokemon$Defense)
0.437

Эффективный код на R

Бутстрэппинг

В идеале выборка берётся из генеральной совокупности, но это не всегда возможно

Вместо этого предполагается, что исходная выборка представительна для совокупности

  1. Выполните выборку с возвращением из ваших данных
    • Одна и та же точка может встречаться несколько раз
  2. Вычислите статистику корреляции для новой выборки
  3. Повторите
Эффективный код на R

Одна итерация бутстрэппинга

bootstrap <- function(data_set) {
    # Sample with replacement
    s <- sample(1:nrow(data_set), replace = TRUE)
    new_data <- data_set[s,]

    # Calculate the correlation
    cor(new_data$Attack, new_data$Defense)
}
# 100 independent bootstrap simulations
sapply(1:100, function(i) bootstrap(pokemon))
Эффективный код на R

Переход на параллельные вычисления

  • Загрузить пакет
  • Указать количество ядер
  • Создать объект кластера
  • Экспортировать функции/данные
  • Перейти на parSapply()
  • Остановить!
library("parallel")
no_of_cores <- 7
cl <- makeCluster(no_of_cores)
clusterExport(cl,
  c("bootstrap", "pokemon"))
parSapply(cl, 1:100,
  function(i) bootstrap(pokemon))
stopCluster(cl)
Эффективный код на R

Замеры времени

Эффективный код на R

Давайте потренируемся!

Эффективный код на R

Preparing Video For Download...