裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

cxxfunction 最も単純な(?)平均値を求める場合

2011年11月10日 | ブログラミング

平均値を求めるくらいなら,何の差もないだろうと...

最初に,素直にベクトル要素に添え字でアクセスしてみたら,mean 関数の速度の半分ほど(要するに,遅いと言うこと)。

「これではならじ」と,ポインタを使って書いたら,

src <- '
    Rcpp::NumericVector x(X);
    int n = x.length();
    double *p;
    double sum = 0;
    p = REAL(x);
    for (int i = 0; i < n; i++) {
        sum += *p++;
    }
    return wrap(sum/n);
'
library(inline)
Mean <- cxxfunction(signature(X="numeric"), src, plugin="Rcpp")

倍速にはなった。

しかし,この場合も他と比べてなんという発見もない。

> x <- rnorm(100000000)

> system.time(a <- mean(x))
                  ユーザ                  システム 
0.38000000000000966338121 0.00099999999999944577667
                    経過 
0.38300000000003819877747
> system.time(b <- Mean(x))
               ユーザ               システム 
0.17300000000000181899 0.00000000000000000000
                 経過 
0.17199999999991177901

> dump(a)
a = -0.000169827373561765

> dump(b)
b = -0.000169827373561735

> a == b
[1] FALSE
> a-b
[1] -2.99781900692241976e-17

100000000 個のデータの平均値が,たかだか 0.4 秒なんだから。
シミュレーションで 1 日に約 20 万回やれるということです。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村