优化 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的主要内容,如果未能解决你的问题,请参考以下文章