42

我一直在从事一些需要我进行大量列表子集化的项目,在分析代码时,我意识到 object[["nameHere"]] 对子集列表的方法通常比 object$nameHere 方法更快。

例如,如果我们创建一个包含命名组件的列表:

a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)

为什么是这样:

system.time (
for (i in 1:10000) {
    a.long.list[["something997"]]
}
)


user  system elapsed 
0.15    0.00    0.16 

比这更快:

system.time (
    for (i in 1:10000) {
        a.long.list$something997
    }
)

user  system elapsed 
0.23    0.00    0.23 

我的问题只是这种行为是否普遍适用,我应该尽可能避免使用 $ 子集,还是最有效的选择取决于其他一些因素?

4

1 回答 1

9

函数[[首先遍历所有尝试精确匹配的元素,然后尝试进行部分匹配。该$函数依次尝试对每个元素进行完全匹配和部分匹配。如果你执行:

system.time (
    for (i in 1:10000) {
     a.long.list[["something9973", exact=FALSE]]
     }
)

即,您正在运行没有完全匹配的部分匹配,您会发现$实际上速度稍快一些。

于 2013-05-24T11:17:19.193 回答