9

我比较了内置 R 函数的性能rnormqnorm以及pnorm等效的 Matlab 函数。

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

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

4

2 回答 2

10

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

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

  • 底层编译代码也存在差异,是的,R 并不总是具有更快的实现,因为 R Core(恕我直言)首先追求精度。(而且 Rcpp 本身并没有帮助:我们只是在内部调用 R 的内容。)这已经出现了,例如 Darren Wilkinson 开始的 MCMC 的 Gibbs Sampler 示例。我注意到 Rrgamma()比其他系统慢得多。因此,要以更快的方式解决您关于 N(0,1) 绘制的问题:我认为我们需要一个贡献的 Ziggurat 实现。这是目前速度更快的 N(0,1) 生成器之一,其他一些系统也使用它。

于 2013-02-14T14:20:10.997 回答
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
于 2013-02-14T15:09:19.020 回答