我将内置R函数rnorm
,qnorm
和pnorm
的性能与等效的Matlab函数进行了比较。
似乎rnorm
和pnorm
函数在R中比在Matlab中慢3-6倍,而qnorm
函数是ca.在R中快了40%。我尝试使用相应的C库来加速R函数,这导致运行时间减少了约30%,这仍然比rnorm
和{{的Matlab慢得多1}}。
是否有可用的软件包可以更快的方式在R中模拟正态分布的随机变量(除了使用标准的pnorm
函数)?
答案 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