【问题标题】:R vs. Matlab: Explanation for speed difference for rnorm, qnorm and pnorm functionsR vs. Matlab:解释 rnorm、qnorm 和 pnorm 函数的速度差异
【发布时间】:2013-02-14 07:15:59
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能已经知道这一点,但要注意的另一件事是,在 R 中挑选大块随机数比逐个挑选它们要快一个...即rnorm(1e6)vapply(seq(1e6),function(i) rnorm(1),numeric(1))快得多

标签: performance r matlab runtime rcpp


【解决方案1】:

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

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

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

【讨论】:

  • 事实上:library("sos"); findFn("Ziggurat") 找到了finzi.psych.upenn.edu/R/library/SuppDists/html/ziggurat.html,它表示“在 R 中运行的这个实现大约是 rnorm() 的三倍。”
  • 谢谢,本。我想我曾经知道这一点,但将它归档在“好,现在我需要 C++ ......”并忘记了。
  • 是的——Ziggurat 回到了 JSS 论文和免费实现。可用时间和其他项目的问题...
  • (几个月后回到这个:)我实际上在今年早些时候发布了一个包RcppZiggurat
【解决方案2】:

将我的评论推广到一个答案:是的,有。

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

在 R 中运行的这个实现大约是 3 倍 和 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

【讨论】:

  • 感谢 Ben 的提示!它实际上将我机器上的运行时间提高了 6 倍。也许还有另一个包也可以改善 pnorm 函数的运行时间?
  • 请注意,Ziggurat 实现仅适用于 32 位操作系统。今年早些时候,我在RcppZiggurat 中为 CRAN 做了一些改进。
猜你喜欢
  • 1970-01-01
  • 2012-10-19
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2014-03-26
  • 2019-02-15
相关资源
最近更新 更多