数分でRのコードを並列化

ステレオタイプを信じるなら、R言語は統計と機械学習に非常に特化したものです。 2番目のステレオタイプは、純粋なRコードはそれほど高速ではないということです。1つは解釈されるため、2つ目は順次実行されるためです。もちろん、ステレオタイプは現実と何らかの関係があり、そうでなければ存在しませんが、それがステレオタイプであり、多くの詳細が失われている世界の非常に単純化された図を提供する理由です。特に、今日は、Rに並列処理を追加し、大きな変更を加えることなく既存のコードの実行を劇的に高速化する、驚くほど簡単な方法を共有したいと思います。これはすべて、ほんの数分で完了します。



いくつかの行と列を含むマトリックスまたはデータテーブルがあり、各行に対してある種の同じ計算を実行したいとします。たとえば、その値の2乗の合計を計算します。計算を関数に移動し、各行に対して呼び出すのは論理的です。



初期データ:



a <- matrix(rnorm(500000, mean=0, sd=2), 100000, 50)


関数:



sum.of.squares <- function(n) {
  n_sq <- sapply(n, function(x) x^2)
  sum(n_sq)
}


単純に行をループしてこの関数を各行に適用できますが、これはRの推奨される方法ではありません。各行の計算は順番に実行され、すべての計算は同じコアで実行されます。この種のコードは実際にはあまり効率的ではありません。念のため、このオプションを書き留めて、実行時間を測定しましょう。



b <- vector()
for(i in 1:dim(a)[1]) {
  b[i] <- sum.of.squares(a[i,])
}


実行時間を測定します。



b <- vector()
start_time <- Sys.time()
for(i in 1:dim(a)[1]) {
  b[i] <- sum.of.squares(a[i,])
}
timediff <- difftime(Sys.time(), start_time)
cat(" : ", timediff, units(timediff))


我々が得る:



 :  4.474074 secs


今回は、他の方法と比較するための出発点として使用します。



. R apply(). , : 1, 2. , . – sapply(), . – . , apply() :



b <- apply(a, 1, function(x) sum.of.squares(x))


, . , , :



start_time <- Sys.time()
b <- apply(a, 1, function(x) sum.of.squares(x))
timediff <- difftime(Sys.time(),start_time)
cat(" : ", timediff, units(timediff))


:



 : 4.484046 secs


, . : , .



, , R , . : apply(), , . , , . , apply(). apply() by(), eapply(), lapply(), Map(), .mapply(), mapply(), replicate(), sapply(), tapply(), vapply(). , future_apply:



install.packages("future.apply") 


– . , :



library("future.apply")
plan(multiprocess)


. , . future::plan(). , , apply "future_". :



b <- future_apply(a, 1, function(x) sum.of.squares(x))


:



start_time <- Sys.time()
b <- future_apply(a, 1, function(x) sum.of.squares(x))
timediff <- difftime(Sys.time(),start_time)
cat(" : ", timediff, units(timediff))


:



 :  1.283569 secs


Intel Core i7-8750H 12 . 12-, .



. , , , , , . , , future_sapply, . . – . , , , (a <- data.frame(a)), , 8 . .



まあ、それだけです。方法は非常に簡単です。私にとって、彼のことを知ったとき、それはただの天の恵みでした。現在のRが並列コンピューティングをサポートしていないというのは本当ですか?この問題の観点、ステートメントの重大度によって異なります。しかし、ある意味では、それはサポートしていると推測できます。




All Articles