优化 R 代码 - Rcpp

Posted

技术标签:

【中文标题】优化 R 代码 - Rcpp【英文标题】:Optimization R code - Rcpp 【发布时间】:2018-05-31 20:15:52 【问题描述】:

除了基准测试功能,R 中是否有任何工具可以让我们找出 R 代码中最大的瓶颈?

我经常对用 C++ 重写 R 代码时获得的计算增益犹豫不决。例如,在每次迭代都需要进行优化的引导程序中,我不知道使用 GSL 库来优化对数似然函数是否有用,因为@987654321 @ 语言函数 R 使用 stats.so 文件。我注意到这样做stats ::: C_optim

> stats:::C_optim
$name
[1] "optim"

$address
<pointer: 0x1cb34e0>
attr(,"class")
[1] "RegisteredNativeSymbol"

$dll
DLL name: stats
Filename: /usr/lib/R/library/stats/libs/stats.so
Dynamic lookup: FALSE

$numParameters
[1] 7

attr(,"class")
[1] "ExternalRoutine"  "NativeSymbolInfo"

查看optim函数体(edit(optim)),看到里面有C实现的高效函数的导入,比如有:

.External2(C_optim, par, fn1, gr1, method, con, lower, 
        upper)

疑问:对于 Rcpp 用户,在您的项目中,您通常会尝试实现所有 C++ 函数还是实现一组小 C++ 函数以用于R函数?

我知道这是一个非常笼统的问题,但我使用的所有函数 Rcpp 总是尝试从头开始实现 C++ 函数。我觉得我用 C++ 编程比用 R 编程更多。有时我认为我需要直接用 C++ 编程。

R 有许多特性使得该语言在执行各种任务时速度变慢。我总是尽量避免循环并让位于apply 系列函数的使用。但是,我经常发现 R 很慢。这样一来,因为我不确定什么值得优化,所以我最终用 C++ 实现所有东西。

【问题讨论】:

您知道您可以查看 CRAN 上使用 Rcpp 的 1360 多个包,对吗?那么为什么不比较行数来获得经验动机的观点呢?现在问题很广泛,可能会被关闭。 【参考方案1】:

如果您(通常)在 R 中编码速度更快,并且想编写大量 C++ 代码,我建议您采用以下方法:

    在 R 中实施您的解决方案。 仅当 R 解决方案不够快时,尝试对其进行优化。 优化的第一步是衡量性能,即分析您的代码。 一旦确定了瓶颈,您就可以使用更好的 R 代码或编译代码来改进这些瓶颈。

凭借经验,您可能能够走捷径,即从一开始就知道您的问题中的某些内容需要编译代码。但这实际上取决于您正在处理的问题类型。

【讨论】:

以上是关于优化 R 代码 - Rcpp的主要内容,如果未能解决你的问题,请参考以下文章

如何分析 Rcpp 代码(在 linux 上)

Rcpp:通过引用列出<->矩阵转换?? + 使用矩阵编程时优化内存分配

连接 R 和 Julia?

逐元素矩阵乘法:R 与 Rcpp(如何加快此代码的速度?)

从 Rcpp 中获取与基 R 相同的整数样本

使用 Rcpp 在 C++ 函数的 R 中使用 for 循环的内存问题