300億円欲しい

メジャーリーグのデータ解析します

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)

f:id:gg_hatano:20130901183327p:plain
小さくて見づらいです.
上から順番に,
.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()

f:id:gg_hatano:20130901213645p:plain

散布図. こちらのほうが見やすいかな

qplot(y=time, data=compare, x = expr, color=expr, geom="boxplot")  + scale_y_log10()

f:id:gg_hatano:20130902220828p:plain

箱ひげ図です.

つづく

補足

.Internalとはなにか.

http://d.hatena.ne.jp/ryamada/20120114/1326433266

http://userprimary.net/posts/2010/03/14/r-internals-quick-tour/

Cで書かれた関数を呼び出すものみたいですね.

そら速いよ.

何が.Internalで実装されているのかはを調べてみます.