R 2.13のコンパイラをつかってみる(3)
http://ito-hi.blog.so-net.ne.jp/2011-07-09-2
> set.seed(1234)
> n <- 10000000 # 速すぎて速度が測れないので多めに設定
>
> x <- rnorm(n, 0, 1)
>
> # ctest2 は test2 をコンパイルしたもの
> test2 <- function(x) {
+ d <- vector("numeric", length(x) - 1)
+ for (i in 1:(length(x) - 1)) {
+ d[i] <- exp(x[i + 1] - x[i])
+ }
+ mean(d)
+ }
>
> ctest2 <- cmpfun(test2)
>
> system.time(a <- ctest2(x)) # for を使ったコンパイラ版(4 つの中では最速)
ユーザ システム 経過
11.379 0.151 11.585
> a
[1] 2.717731
>
> # test2 をベクトル演算を使って高速化
> test3 <- function(x) {
+ n <- length(x)
+ mean(exp(x[-1]-x[-n]))
+ }
> system.time(ans3 <- test3(x))
ユーザ システム 経過
0.669 0.268 0.930 # これでも,17 倍速
> ans3
[1] 2.717731
>
> # test2 を インラインにする
> library(inline)
> src <- '
+ Rcpp::NumericVector x(X);
+ int n = x.length();
+ double mean = 0;
+ for (int i = 0; i < n-1; i++) {
+ mean +=exp(x(i+1)-x(i));
+ }
+ return wrap(mean/(n-1));
+ '
> test4 <- cxxfunction(signature(X="numeric"), src, plugin="Rcpp")
> system.time(ans4 <- test4(x))
ユーザ システム 経過
0.251 0.001 0.250 # 45 倍速
> ans4
[1] 2.717731
※コメント投稿者のブログIDはブログ作成者のみに通知されます