【问题标题】:why calling a function specifying the namespace is slower?为什么调用指定命名空间的函数更慢?
【发布时间】:2013-08-03 11:44:39
【问题描述】:

我认为指定命名空间是我给R 的工作更少,但我可能错了

library(microbenchmark)
> microbenchmark(unique.default(c(1,1:10)),base::unique.default(c(1,1:10)))
Unit: microseconds
                             expr    min     lq  median     uq    max neval
       unique.default(c(1, 1:10))  3.528  3.849  4.0095  4.170 12.509   100
 base::unique.default(c(1, 1:10)) 11.546 12.188 12.5090 12.829 59.012   100

【问题讨论】:

  • 有人需要指出:这些是微秒!如果您的代码要做更复杂的事情,这可能是微不足道的。
  • @flodel 99.9% 你是对的。但是我有一个程序有很多函数调用,都在一个大循环中。由于data.table,我即将推出一个完全矢量化的新版本,但它仍处于开发模式,因此同时在循环的每个周期中节省的毫秒在整个程序中减少了几分钟......
  • 如果您有名称冲突,这就是您需要:: 的原因,您可以使用my.unique <- base::unique.default 并使用my.unique

标签: r performance namespaces


【解决方案1】:

第一个从附加base时创建的包环境中获取函数:

> "unique.default" %in% ls("package:base")
[1] TRUE

第二个使用函数::从包命名空间中获取函数:

> `::`
function (pkg, name) 
{
    pkg <- as.character(substitute(pkg))
    name <- as.character(substitute(name))
    getExportedValue(pkg, name)
} 

看看这需要多少函数调用。

如果您只需要一个函数一次,那么从命名空间中获取它可能会更有效。但是如果你重复需要它或者需要一个包中的几个功能,你应该附上这个包。

【讨论】:

  • 或者使用带有命名空间文件的包。
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2012-09-26
  • 2019-02-19
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
相关资源
最近更新 更多