R与Matlab:rnorm、qnorm和pnorm函数速度差的解释



我将内置的R函数rnormqnormpnorm的性能与等效的Matlab函数进行了比较。

似乎rnormpnorm函数在R中的速度是Matlab中的3-6倍,而qnorm函数在R中快约40%。我尝试使用Rcpp包通过使用相应的C库来加速R函数,这导致运行时间减少了约30%,这仍然比Matlab的rnormpnorm慢得多。

有没有一个包可以提供一种更快的方法来模拟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

相关内容

  • 没有找到相关文章

最新更新