2017-10-11 3 views
2

Rcppを初めて使用し、そのアプリケーションを探索しています。特に、私は一部previous answer上に構築され、以下の機能をスピードアップしようとしています:Rcpp - forとwhileループ内でランダムノーマル描画を高速化します。

code = 'NumericVector RcppFun(int N){ 
      NumericVector out(N); 
      for (int i = 0; i < N; ++i) { 
       double V = 0; 
       while(V > -1e04 && V < 1e04) { 
        V += R::rnorm(10, 100); 
        } 
       out[i] = V; 
       } 
      return out; 
      }' 
cppFunction(code) 
system.time(RcppFun(1e05)) 

コードは、そのRの対応よりもかなり高速ですが、それでも私のコンピュータ上で実行するために、いくつかの秒を要します。この関数を何回か呼び出す必要があることを考えれば、私はその性能をさらに改善できるかどうか疑問に思っていました。

whileループ内の論理ステートメントを変更したり、RNG関数を変更すると、何らかの形で関数が高速化すると考えられていましたが、どうやって解決できなかったのでしょうか。

ありがとうございました!

EDIT:rbenchmark ::ベンチマーク推計に基づき

#include <Rcpp.h> 
// [[Rcpp::depends(RcppZiggurat)]] 
#include <Ziggurat.h> 
using namespace Rcpp; 
static Ziggurat::Ziggurat::Ziggurat zigg; 
// [[Rcpp::export]] 
NumericVector ZiggFun(int N){ 
      NumericVector out(N); 
      for (int i = 0; i < N; ++i) { 
       double V = 0; 
       while(V > -1e04 && V < 1e04) { 
        V += 10 + zigg.norm()*100; 
        } 
       out[i] = V; 
       } 
      return out; 
      } 

は、新しいコードは今より7さ:だけ完全を期すため、ここで私はディルクの非常に役立つ提案をもとにC++で書いたコードです倍速く!あなたがより速くRNGのためRcppZigguratを使用することができます

答えて

3

は引き分け - 私はパッケージに比較タイミングいる:

R> library(RcppZiggurat) 
R> library(microbenchmark) 
R> microbenchmark(rnorm(1e5), zrnorm(1e5)) 
Unit: microseconds 
      expr  min  lq mean median  uq  max neval cld 
    rnorm(1e+05) 6148.781 6169.917 6537.31 6190.073 6923.357 10166.96 100 b 
zrnorm(1e+05) 719.458 887.554 1016.03 901.182 939.652 2880.47 100 a 
R> 

このRNGはあまりにもC++のレベルで他のパッケージに使用することができます。通常の方法で引っ張るだけのヘッダーです。

関連する問題