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

标签 r rcpp exp

好的,我知道答案,但受到了 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/

相关文章:

gpu - `exp` 的计算成本如何?

Java Math.exp() 和 Python math.exp()

r - 在 R 中,在事件之后而不是之前标记 ID 的行

r - 在 R 中轻松输入相关矩阵

r - 在 R 中运行 Rcpp cde 时出现 "not a matrix"错误

c++ - 在 rccp int 中保留前导零

r - 错误: Package or namespace load failed

r - Gurobi 软件包未在 Ubuntu 14.04 中加载,dyn.load(文件,DLLpath = DLLpath,...): 中出错

c++ - 无形中返回结果

c++ - EXP 转 泰勒级数