好吧,我们都熟悉R中的双冒号运算符.每当我要写一些函数时,我都会使用require(<pkgname>),但我一直在考虑使用::.require在自定义函数中使用是比更好的做法library,因为require返回警告,并且FALSE,library如果提供不存在的包的名称,则会返回错误.
另一方面,::操作员从包中获取变量,同时require加载整个包(至少我希望如此),因此速度差异首先出现在我的脑海中.::必须快于require.
我做了一些分析,以便检查 - 我写了两个简单的函数,read.systat从foreign包中加载函数require,::分别使用和导入Iris.syd数据集,包含foreign包,每个复制函数1000次(这是无耻的任意),和. ..打了一些数字.
奇怪(或没有)我发现在用户CPU和经过时间方面存在显着差异,而在系统CPU方面没有显着差异.然而更奇怪的结论::是:实际上更慢!文档::是非常生硬的,只是通过查看来源,显然::应该表现更好!
要求
#!/usr/local/bin/r
## with require
fn1 <- function() {
require(foreign)
read.systat("Iris.syd", to.data.frame=TRUE)
}
## times
n <- 1e3
sink("require.txt")
print(t(replicate(n, system.time(fn1()))))
sink()
Run Code Online (Sandbox Code Playgroud)
双结肠
#!/usr/local/bin/r
## with ::
fn2 <- function() {
foreign::read.systat("Iris.syd", to.data.frame=TRUE) …Run Code Online (Sandbox Code Playgroud)