繁体   English   中英

R 中的内置函数通常会优化吗?

[英]Are built-in functions in R usually optimized?

我有一些书面代码来计算 R 中的相关系数。 但是,我刚刚发现“引导” package 提供了一个 corr() 函数,它可以完成同样的工作。 R 中的内置函数通常比我们从头编写的等效函数更高效、更快吗?

谢谢你。

我认为这个问题没有一个具体的答案,因为它会根据您询问的特定 function 的不同而有很大差异。 贡献包中的一些函数是为了方便而添加的,它们只是基本函数的包装。 添加其他的以扩展基本功能或解决基本功能中的一些其他感知缺陷。 添加一些您建议的内容是为了缩短计算时间或提高效率。 添加其他包是因为贡献包的作者认为基础 R 中的解决方案在某些方面完全是错误的。

对于stats:::corboot:::corr ,看起来后者增加了加权能力。 它并不一定看起来更快:

> dat <- matrix(rnorm(1e6), ncol = 2)
> system.time(
+ cor(dat[, 1],dat[, 2])
+ )
   user  system elapsed 
   0.01    0.00    0.02 
> system.time(
+ corr(dat)
+ )
   user  system elapsed 
   0.11    0.00    0.11 

This more-less (ie not counting crappy code) boils down to a question whether certain procedure is implemented in R or as a C(++) or Fortran code -- if the function contains a call to .Internal , .External , .C , .Fortran.Call这意味着这是第二种情况,可能会更快。 请注意,这与问题天气 function 来自基础 R 或 package 是正交的。

但是,您必须始终记住,效率是一个相对的事情,必须始终在整个任务的上下文中被感知,并与程序员为加快某些事情所必需的努力相权衡。 将执行时间从 1 秒减少到 10 毫秒,重写所有内容以使用 base 只是因为包是邪恶的,或者花几个小时优化 function A 而 90% 的实际执行时间隐藏在 function B 中,这同样是胡说八道。

扩展蔡斯的回答,我不仅认为这个问题没有单一的答案,而且这个问题也不是那么好。 这是非常不具体的。 在此处查看要问的问题。
此外,我感觉 OP 不知道基础 R 的cor function,请参阅?cor

我的回答:有一些专门的函数非常快,例如rowSumsapply相比sum 另一方面,有一些内置的缓慢是可以避免的(如果你愿意花一些时间来了解基础知识),但由于设计决策而内置。 Radford Neal 在这个角落争论不休,请参阅他关于该主题的最新帖子之一

总之,我想这个问题的答案可以归结为我认为 R 背后的哲学:R 不是比赛中最快的马,但绝对是用最少的代码实现最多的马,如果它是关于数据的话。

总的来说,我认为 state 没有那么错,function 越专业,它非常快的可能性就越高(并且用 Z0D61F8370CAD1D412F80B84D143E1257 或 For For 编写)。 function 越通用和抽象,它通常越慢(将 Hadley Wickham 的plyr的速度与基本的apply系列进行比较)。

还有一点是,内置的 R 函数通常有很多“包装”材料,用于进行错误检查、重新排列数据等。例如, lmglm在移交给lm.fitglm.fit分别用于实际数字运算。 在您的特定情况下, cor调用.Internal(cor(x, y, na.method, FALSE))以获得 Pearson 相关性。 如果 (1) 你真的需要速度并且 (2) 你愿意自己适当地安排数据,并且放弃错误检查,你有时可以通过自己调用内部 function 来节省一些时间:

library(rbenchmark)
x <- y <- runif(1000)
benchmark(cor(x,y),.Internal(cor(x,y,4,FALSE)),replications=10000)
                            test replications elapsed relative user.self
1                      cor(x, y)        10000   1.131 5.004425     1.136
2 .Internal(cor(x, y, 4, FALSE))        10000   0.226 1.000000     0.224

但这又取决于:当矩阵很大时,我们根本不会获得太多收益,如上面的示例(因此相对于进行计算的错误检查所花费的时间要大得多)......

x <- y <- rnorm(5e5)
benchmark(cor(x,y),.Internal(cor(x,y,4,FALSE)),replications=500)
                            test replications elapsed relative user.self
1                      cor(x, y)          500   5.402 1.013889     5.384
2 .Internal(cor(x, y, 4, FALSE))          500   5.328 1.000000     5.316

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM