9

組み込みのR関数と同等のMatlab関数のパフォーマンスを比較しrnormましたqnormpnorm

rnormandpnorm関数はMatlabよりもRで3〜6倍遅いように見えますが、qnorm関数は約1です。Rでは40%高速です。対応するCライブラリを使用してR関数を高速化するためにRcppパッケージを試しました。その結果、実行時間が約30%減少しましたが、これはMatlabよりも大幅に低速rnormですpnorm

rnorm(標準関数を使用する以外に)Rで正規分布の確率変数をシミュレートするより高速な方法を提供するパッケージが利用可能ですか?

4

2 に答える 2

10

ここには、各段落に1つずつ、2つの異なる問題があります。

  • はい、RやMatlabなどの言語/システムには違いがあります。その一部は、インタープリター、ループの速度、関数呼び出しの速度などに関係しています。pp。Rcppは、本物のJITコンパイラーを備えたMatlabに関して役立ちます。RcppArmadilloに関する最近の論文で、カルマンフィルターのMatlab、R、およびR+Rcppを比較しています。

  • 基礎となるコンパイル済みコードにも違いがあります。もちろん、Rコア(正しくはIMHO)が最初に精度を追求するため、Rの実装が常に高速であるとは限りません。(そして、Rcpp自体は役に立ちません。Rが内部的に持っているものと呼ぶだけです。)これは、たとえば、DarrenWilkinsonが開始したMCMCのギブスサンプラーの例で思いついたものです。rgamma()Rは他のシステムよりもはるかに遅いことに気づきました。したがって、N(0,1)の描画に関する質問に答えるには、より高速な方法が必要です。貢献したZigguratの実装が必要だと思います。これは、より高速なN(0,1)ジェネレーターの1つであり、他のいくつかのシステムがそれを使用しています。

于 2013-02-14T14:20:10.997 に答える
9

私のコメントを答えに昇格させるために:はい、あります。

library("sos"); findFn("Ziggurat")パッケージ内のrziggurat関数を検索し ます。SuppDistsそれはC(またはC ++?)で実装されており、そのドキュメントには

Rで実行されるこの実装は、rnorm()の約3倍の速度です。

注意すべきもう1つのポイントは、実際にはそれ以上の違いが生じる可能性があることです。Rでは、乱数の大きなブロックを1つずつ選択するよりも、1つずつ選択するrnorm(1e6)よりもはるかに高速です。vapply(seq(1e6),function(i) rnorm(1),numeric(1))

 library("SuppDists")
 library("rbenchmark")
 n <- 1e5
 benchmark(rziggurat(n),
          rnorm(n),
          vapply(seq(n),function(x) rnorm(1),numeric(1)))

##           test   elapsed   relative user.self
## 2     rnorm(n)     1.138     13.233     1.140
## 1 rziggurat(n)     0.086      1.000     0.088
## 3  vapply(...)    29.043    337.709    29.046
于 2013-02-14T15:09:19.020 に答える