gpt4 book ai didi

r - 为什么自写的 Rcpp 向量化数学函数比它的基本函数更快?

转载 作者:行者123 更新时间:2023-12-03 16:54:19 25 4
gpt4 key购买 nike

好的,我知道答案,但受到了 this question 的启发,我想得到一些关于以下方面的好意见:为什么下面的 Rcpp 练习是 ca。比内置 exp() 快 15%(对于长向量) ?我们都知道 Rcpp 是 R/C API 的包装器,因此我们应该期望性能稍差。

Rcpp::cppFunction("
NumericVector exp2(NumericVector x) {
NumericVector z = Rcpp::clone(x);
int n = z.size();
for (int i=0; i<n; ++i)
z[i] = exp(z[i]);
return z;
}
")

library("microbenchmark")
x <- rcauchy(1000000)
microbenchmark(exp(x), exp2(x), unit="relative")
## Unit: relative
## expr min lq median uq max neval
## exp(x) 1.159893 1.154143 1.155856 1.154482 0.926272 100
## exp2(x) 1.000000 1.000000 1.000000 1.000000 1.000000 100

最佳答案

Base R 倾向于对 NA 做更多检查所以我们可以通过不这样做来赢得一点。还要注意,通过使用循环展开(如在 Rcpp Sugar 中所做的那样)之类的技巧,我们还可以做得更好。

所以我加了

Rcpp::cppFunction("NumericVector expSugar(NumericVector x) { return exp(x); }")

有了这个,我得到了进一步的收获——用户端的代码更少:
R> microbenchmark(exp(x), exp2(x), expSugar(x), unit="relative")
Unit: relative
expr min lq mean median uq max neval
exp(x) 1.11190 1.11130 1.11718 1.10799 1.08938 1.02590 100
exp2(x) 1.08184 1.08937 1.07289 1.07621 1.06382 1.00462 100
expSugar(x) 1.00000 1.00000 1.00000 1.00000 1.00000 1.00000 100
R>

关于r - 为什么自写的 Rcpp 向量化数学函数比它的基本函数更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26431138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com