Tri*_*tio 0 algorithm optimization r rcpp
我正在编写一个用于统计分析和机器学习 (ML) 的 R 包,该包通常非常慢。它很慢,因为它涉及训练和预测模型,包括统计和机器学习。我的包与模型无关,我的意思是它与 R 中的任何其他模型训练和预测包接口,以重新训练他们的模型并使用他们的模型进行预测。经过广泛的分析和代码重构(主要是通过尽可能多地转换为向量化和矩阵运算),我发现无法通过重构进一步加快速度的慢点归结为以下代码:
我想知道Rcpp是否可以帮助加快我的情况。请注意我在这里没有问什么:
我对Rcpp是否有帮助的主要疑问是,最慢的代码是当我调用其他包的 R 函数时。我已经阅读了大量有关 Rcpp 的文章,甚至正在参加有关该主题的 DataCamp 课程。然而,从我目前对 Rcpp 的探索来看,尽管许多资料解释了为什么我们要使用 Rcpp(以加速缓慢的 R 代码),但我无法找到任何资料来清楚地说明 Rcpp 无法帮助解决哪些问题。
据我所知,Rcpp 在调用 R 函数时无法提供任何加速。减慢我的代码速度的函数是由其他包编写的函数。例如,我有一篇文章演示了我的包功能,分别使用nnet::nnet()
和nnet::predict.nnet()
来训练和预测神经网络,以及分别使用gbm::gbm()
和gbm::predict.gbm()
来训练和预测梯度增强机。有没有办法使用Rcpp来优化这些函数的调用?
如果我可以Rcpp::cppFunction()
实时调用来接收这些函数,将它们编译为 C++,然后继续用我的程序执行它们,那么这可能是一个可行的解决方案。但这对于 Rcpp 来说可能吗?我将不胜感激这里的任何指导。我愿意接受一个明确解释的答案:“不,Rcpp 无法帮助您解决问题,原因如下。”
根据Dirk Eddelbuettel(Rcpp 的创建者)的文章“从 C++ 调用 R 函数”:
\n\n\n调用函数的速度 [\xe2\x80\xa6] 很慢,因为涉及到开销。从 C++ 代码内部重复调用它(可能隐藏在多个循环中)是非常愚蠢的。这必须比等效的 C++ 代码慢,甚至比 R 代码慢(因为数据编组)。
\n
那篇文章已经有 11 年历史了,现在的开销比当时少得多(向用户Ada Lovelace指出这一点致敬),但核心点仍然正确:从 C++ 代码调用 R 函数仍然有比从 R 代码调用相同的 R 函数要慢。
\n