バイトコンパイルパッケージcompilerを使ったRでの処理速度向上

"snow"を用いた円周率計算の高速化を検討した記事にあるとおり、for文での計算を高速化することができなかった。

この単純なfor文での計算速度は、自作関数のバイトコンパイルを行うパッケージ"compiler"によって高速化できることに気がついた。

そこで今回は、"compiler"を用いた高速化について検討する。

初めに

前回同様、数値積分法を用いて近似的に円周率を求める手法について考える。

実際には以下の関数を用いて計算を行う。

  N <- 5*10^6

func_calc <- function(i){
   x <- (i - 0.5) / N
   y <- 4.0 / (1.0 + x * x)
   return(y/N)}

pi <- 0
before <- proc.time();for(I in 1:N){pi <- pi + func_calc(I)}; after <- proc.time();print(after - before)
 

パフォーマンス比較

標準的なfor文を使い、5*106ステップで円周率を求めた結果は以下の通り。

つづいて、バイトコンパイルにより自作関数を変換した場合。

これより、自作関数の処理速度がおよそ二倍向上することが分かる。

終わりに

"compiler"による高速化は、対象とする処理によって大きく左右される。teramonagiさんの記事にあるとおり、内部関数は既に最適化(読み込み時にバイトコンパイル)されているそうなので、apply系を含めた処理ではそれ以上の高速化が見込めないようだ。

それでも高速化が必要な場合、パッケージ"Rcpp"を使ってボトルネックとなる箇所をC++で記述する方法もある。次回はこの方法について検討してみよう。

  


本ページには、Amazon.co.jpアソシエイト・プログラムによるリンクが含まれております。