R vs. Matlab:rnorm,qnorm和pnorm函数的速度差异解释

use*_*987 9 performance matlab runtime r rcpp

我比较了内置R函数的性能rnorm,qnorm以及pnorm等效的Matlab函数.

似乎rnormpnorm函数在R中比在Matlab中慢3-6倍,而qnorm函数是ca. 40%的R.更快我试图RCPP包通过使用这导致减少在运行期间由〜30%,其仍然比显著Matlab的较慢相应的C库来加快R的功能rnormpnorm.

是否有可用的包提供了一种更快的方法来模拟R中的正态分布随机变量(除了使用标准rnorm函数)?

Dir*_*tel 10

我在这里看到两个不同的问题,每个段落一个:

  • 是的,R和Matlab等语言/系统之间存在差异.它的一部分与解释器,循环速度,函数调用速度等有关.Rcpp可以帮助Matlab,它有一个真正的JIT编译器.我们在最近关于RcppArmadillo的论文中对Matlab,R和R + Rcpp进行了卡尔曼滤波器的比较.

  • 底层编译代码也有区别,是的,R并不总是具有更快的实现,因为R Core(恕我直言)正确地首先考虑精度.(并且Rcpp本身并没有帮助:我们只是在内部调用R.)这已经出现了例如Darren Wilkinson开始的MCMC的Gibbs采样器示例.我注意到R rgamma()比其他系统慢得多.因此,以更快的方式得到关于N(0,1)绘制的问题:我认为我们需要一个贡献的Ziggurat实现.那是那里比较快的N(0,1)发生器之一,还有一些其他系统使用它.


Ben*_*ker 9

提出我的评论答案:是的,有.

library("sos"); findFn("Ziggurat")在包中找到 rziggurat函数SuppDists; 它是用C(或C++?)实现的,它的文档说明了

在R中运行的这个实现大约是rnorm()的三倍.

另一点需要注意的是,在实践中可能会产生相同或更多的差异,因为在R中挑选大块随机数比在一个接一个地选择它们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
Run Code Online (Sandbox Code Playgroud)