R:为什么是子集划分列表比使用$更快[[]]的方法呢?(R: Why is the [[ ]] ap

2019-09-16 06:01发布

我一直对那些要求我做了很多列表子集的几个项目,而配置代码,我意识到,对象[[“nameHere”]的方法来子集划分名单,通常是比对象$ 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 

我的问题是,这种行为简直是真普遍,我应该避免$子集尽可能或做最有效的选择依赖于某些其他因素?

Answer 1:

功能[[首先通过所有元素试图进行精确匹配, 然后尝试做部分匹配。 在$功能依次尝试每个元素上都完全和部分匹配。 如果你执行:

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

比如,你正在运行一个部分匹配那里没有精确匹配,你会发现, $ ,其实是非常轻微快。



文章来源: R: Why is the [[ ]] approach for subsetting a list faster than using $?