[R]関数をコンパイルして動作を速くする
cmpfun関数を使えばよい。
以下は実行例。以下の例では、rm関数でオブジェクトをすべて削除し、カレントフォルダーにtemp.tmpというファイルを書き出して削除するということを行っているので注意。また、今店頭で売られているようなパソコンでは実行時間が数十秒~1分強かかるので注意。
スクリプト
# パッケージcompilerを使用
library(compiler)
# 最初に全オブジェクトを削除
rm(list = ls(all = TRUE))
# サンプル関数
# 時間を計るための意味のない計算とファイルアクセス
calc <- function() {
for (i in 1:400) {
d <- rnorm(3000)
for (j in 1:3000) {
d[1] <- d[1] + d[j]
}
write(d, file = "temp.tmp")
for (j in 1:300) {
d[j] <- d[j] * j
}
file.remove("temp.tmp")
}
}
# 関数実行1回目に要した時間を表示
print(system.time(calc()))
# 関数実行2回目に要した時間を表示
print(system.time(calc()))
# 関数実行3回目に要した時間を表示
print(system.time(calc()))
# サンプル関数をコンパイル
calcc <- cmpfun(calc)
# コンパイルした関数の実行に要した時間を表示
print(system.time(calcc()))
出力
ユーザ システム 経過
5.90 4.36 14.19
ユーザ システム 経過
5.70 4.47 11.68
ユーザ システム 経過
6.04 4.03 11.72
ユーザ システム 経過
4.28 4.43 10.27
コンパイル前の2回目と3回目が多少早く実行されているのは、コンピューターに残っていたキャッシュを参照しているからかもしれない。コンパイル後に実行したものは明らかに実行時間が短い。


