« [Fortran]組み込み関数の個別名と総称名について(dsinとsin、dabsとabsなど) | トップページ | [R]尖度の計算 »

2015年1月23日 (金)

[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回目が多少早く実行されているのは、コンピューターに残っていたキャッシュを参照しているからかもしれない。コンパイル後に実行したものは明らかに実行時間が短い。

« [Fortran]組み込み関数の個別名と総称名について(dsinとsin、dabsとabsなど) | トップページ | [R]尖度の計算 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« [Fortran]組み込み関数の個別名と総称名について(dsinとsin、dabsとabsなど) | トップページ | [R]尖度の計算 »

無料ブログはココログ

■■

■■■