Rで計算時間の比較をしたい(その1)
Rは工夫してコードを書かないと遅いことがあります.
どの手法が遅いのか.
計算時間を比較して, 最速技法を身につけたいです.
計算時間を知りたければ,
time <- system.time( 何かの関数 )
とすればOKです.
計算時間をグラフに表して比較したいです.
同じことを他の関数に行い, 適当に調整してplotして...
...
面倒です.
全部やってくれる関数があればいいのに.
ありました. microbenchmarkパッケージです.
microbenchmarkパッケージの使い方
http://cran.r-project.org/web/packages/microbenchmark/index.html
なるほど. よく分かりません.
R-bloggersの記事を見ながら手を動かしてみます.
http://www.r-bloggers.com/faster-higher-stronger-a-guide-to-speeding-up-r-code-for-busy-people/
とりあえずインストールしましょう. タダですから.
#install.packages("microbenchmark") library(microbenchmark) #使い方 compare <- microbenchmark(関数1, 関数2, 関数3 , ....)
関数を入れれば, 計算時間の分布を出力してくれます.
実際にやってみます. 平均の計算方法を比較します.
mean()を使うか, sum(x)/length(x)を使うか...
# library(microbenchmark) # 適当にデータを作ります. x <- sample(1:100, 100, replace = TRUE) # microbenchmark関数を使います compare <- microbenchmark(mean(x), sum(x)/length(x), # 意味は同じ .Internal(mean(x)), # 速いらしい times = 1e+05) # 繰り返しの回数 compare #Unit: nanoseconds # expr min lq median uq max neval # mean(x) 6155 6471.5 6608.5 6802.0 44757 1000 # sum(x)/length(x) 989 1107.0 1235.0 1334.0 5374 1000 # .Internal(mean(x)) 638 680.0 729.0 802.5 9115 1000 autoplot(compare)
小さくて見づらいです.
上から順番に,
.Internal(mean(x)), mean(x), sum(x)/length(x)
の実行時間の分布です.
1番上にある.Internal(mean(x))がちょっとだけ速いことがわかりました.
.Internalが何をしているのかは後で調べます.
2番目と3番目を見ます.
素直に平均を計算させたmeanが, 回りくどく書いたsum/lengthよりも速いのは納得です.
これは面白い表示方法ですね. 分かりやすいかどうかはともかく.
散布図を作ります
qplot(y=time, data=compare, color=expr) + scale_y_log10()
散布図. こちらのほうが見やすいかな
qplot(y=time, data=compare, x = expr, color=expr, geom="boxplot") + scale_y_log10()
箱ひげ図です.
つづく
補足
.Internalとはなにか.
http://d.hatena.ne.jp/ryamada/20120114/1326433266
http://userprimary.net/posts/2010/03/14/r-internals-quick-tour/
Cで書かれた関数を呼び出すものみたいですね.
そら速いよ.
何が.Internalで実装されているのかはを調べてみます.