我将内置的R函数rnorm
、qnorm
和pnorm
的性能与等效的Matlab函数进行了比较。
似乎rnorm
和pnorm
函数在R中的速度是Matlab中的3-6倍,而qnorm
函数在R中快约40%。我尝试使用Rcpp包通过使用相应的C库来加速R函数,这导致运行时间减少了约30%,这仍然比Matlab的rnorm
和pnorm
慢得多。
有没有一个包可以提供一种更快的方法来模拟R中的正态分布随机变量(而不是使用标准的rnorm
函数)?
我在这里看到了两个不同的问题,每段一个:
-
是的,R和Matlab等语言/系统之间存在差异。它的一部分与解释器、循环速度、函数调用速度等有关。Rcpp可以帮助实现具有真正JIT编译器的Matlab。在最近关于RcppArmadillo的论文中,我们对卡尔曼滤波器的Matlab、R和R+Rcpp进行了比较。
-
底层编译代码也有差异,是的,R并不总是有更快的实现,因为R Core(IMHO正确地)追求精度第一。(Rcpp本身并没有帮助:我们只是称R内部有什么。)这是Darren Wilkinson开始的MCMC的Gibbs采样器的例子。我注意到R的
rgamma()
比其他系统慢得多。因此,为了更快地回答您关于N(0,1)draw的问题:我认为我们需要一个有贡献的Ziggurat实现。这是速度更快的N(0,1)生成器之一,其他一些系统也使用它
要将我的评论提升为答案:是的,有.
CCD_ 11在CCD_;它是用C(或C++?)实现的,它的文档上写着
这个在R中运行的实现大约是快如rnorm()。
另一点需要注意的是,在实践中可能会产生同样大或更多的差异,那就是在R中挑选一大块随机数比逐个挑选要快得多。。。即CCD_ 13比CCD_
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