0

嗨,我刚刚有一个关于使用多个函数编写更快的 R 脚本的快速问题:假设每个示例中的内容完全相同,以下哪个运行得更快?函数中的函数,即

function(args)
{
function_using_previous_function_output(args)
{ manipulation of arguments}

}

相互传递东西的函数:

function(args)
{return(output}
}

function_using_previous_function_output(output)
{
manipulation of arguments
}

这些中是否有样式或优化的最佳实践?

非常感谢!

4

2 回答 2

5

简短的回答;在优化代码方面,您正在寻找错误的途径。

长答案;

内容几乎总是剧本表演中最重要的方面。如果您的代码已经并行化、矢量化、Rcpp 化和字节编译(require(compiler);enableJIT(3)),并且您仍然需要更快的速度,那么您只应该真正伪造您的语法。

在您需要更改代码本身的形状以提高速度的极少数情况下,这些文章是您的朋友

http://www.r-bloggers.com/speeding-up-r-computations/ http://radfordneal.wordpress.com/2010/08/15/two-surpising-things-about-r/

回答你原来的问题;您应该使用 system.time() 函数确定效率;我怀疑无论哪种方式都会有统计学上的显着差异

于 2013-02-20T17:25:31.153 回答
3

我一直在编写一个模拟包,它使用许多功能来根据生物模型的不同过程执行不同的步骤。然后这些函数本身由主函数调用,主函数通过调用它们并偶尔用这些子函数的输出自己做一些事情来进行模拟。关键是它在很大程度上依赖于函数中的函数;当我在我的主要模拟功能中有一系列步骤时,我看不出有太大的速度差异 - 然后为了整理它,我将这些步骤放入子功能中。但是我更喜欢它,因为当每个子函数完成时,在子函数期间使用的任何变量或垃圾,但实际上并未用于任何结果或return()'d 在子函数结束时被消除,这意味着当您不想修改变量时意外修改变量的可能性较小。通常,当您进行循环操作并将其矢量化或使用 Rcpp 在 C++ 中执行此操作时,我所看到的 R 中的主要速度差异就会出现。无论如何,R 中的大多数核心内容现在都很快,并且已经进行了字节编译。

于 2013-02-20T14:54:35.913 回答