gpt4 book ai didi

Rcpp 函数比 Rf_eval 慢

转载 作者:行者123 更新时间:2023-12-04 09:10:59 24 4
gpt4 key购买 nike

我一直在研究一个包,它使用 Rcpp 在一组大型医学影像文件上应用任意 R 代码。我注意到我的 Rcpp 实现比原来的纯 C 版本慢得多。我追踪了通过 Function 调用函数与原始 Rf_eval 的区别。我的问题是为什么会出现接近 4 倍的性能下降,有没有办法加快函数调用的速度,使性能更接近 Rf_eval?

例子:

library(Rcpp)                                                                                                                                                          
library(inline)
library(microbenchmark)

cpp_fun1 <-
'
Rcpp::List lots_of_calls(Function fun, NumericVector vec){
Rcpp::List output(1000);
for(int i = 0; i < 1000; ++i){
output[i] = fun(NumericVector(vec));
}
return output;
}
'

cpp_fun2 <-
'
Rcpp::List lots_of_calls2(SEXP fun, SEXP env){
Rcpp::List output(1000);
for(int i = 0; i < 1000; ++i){
output[i] = Rf_eval(fun, env);
}
return output;
}
'

lots_of_calls <- cppFunction(cpp_fun1)
lots_of_calls2 <- cppFunction(cpp_fun2)

microbenchmark(lots_of_calls(mean, 1:1000),
lots_of_calls2(quote(mean(1:1000)), .GlobalEnv))

结果

Unit: milliseconds
expr min lq mean median uq max neval
lots_of_calls(mean, 1:1000) 38.23032 38.80177 40.84901 39.29197 41.62786 54.07380 100
lots_of_calls2(quote(mean(1:1000)), .GlobalEnv) 10.53133 10.71938 11.08735 10.83436 11.03759 18.08466 100

最佳答案

Rcpp 很棒,因为它让程序员看起来干净 荒谬。清洁度以模板化响应的形式和一组降低执行时间的假设为代价。但是,通用代码设置与特定代码设置就是这种情况。

Rcpp::Function 的调用路由为例.初始构造以及随后对 Rf_reval 修改版本的外部调用需要特殊的 Rcpp 特定 eval 函数,在 Rcpp_eval.h 中给出。 .反过来,此函数包含在保护中,以防止在通过 Shield 调用 R 时出现函数错误。与之相关。等等……

相比之下,Rf_eval 两者都没有。如果它失败了,你将在没有桨的情况下逆流而上。 (当然,除非您通过 R_tryEval implement error catching 获取它。)

话虽这么说,加速计算的最佳方法是简单地用 C++ 编写计算所需的所有内容。

关于Rcpp 函数比 Rf_eval 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845012/

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