use*_*987 9 performance matlab runtime r rcpp
我比较了内置R函数的性能rnorm,qnorm以及pnorm等效的Matlab函数.
似乎rnorm和pnorm函数在R中比在Matlab中慢3-6倍,而qnorm函数是ca. 40%的R.更快我试图RCPP包通过使用这导致减少在运行期间由〜30%,其仍然比显著Matlab的较慢相应的C库来加快R的功能rnorm和pnorm.
是否有可用的包提供了一种更快的方法来模拟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)发生器之一,还有一些其他系统使用它.
提出我的评论答案:是的,有.
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)
| 归档时间: |
|
| 查看次数: |
5123 次 |
| 最近记录: |