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

时间:2013-02-14 07:15:59

标签: performance r matlab runtime rcpp

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

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

是否有可用的软件包可以更快的方式在R中模拟正态分布的随机变量(除了使用标准的pnorm函数)?

2 个答案:

答案 0 :(得分: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)发生器之一,还有一些其他系统使用它。

答案 1 :(得分:9)

将我的评论提升为答案:是的,有。

library("sos"); findFn("Ziggurat")SuppDists包中找到rziggurat函数;它是用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