R:为什么使用]比使用$更快?
我一直在研究一些需要我做大量列表子集的项目,而在分析代码的时候,我意识到对列表进行子集化的对象[[nameHere]]方法通常比对象$ nameHere方法快。
作为一个例子,如果我们用命名组件创build一个列表:
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
我的问题是,这种行为是否真的是普遍的,我应该尽可能地避免$子集,或者最有效的select取决于其他因素?
函数[[
首先遍历所有元素,尝试精确匹配, 然后尝试做部分匹配。 $
函数依次尝试精确匹配和部分匹配。 如果您执行:
system.time ( for (i in 1:10000) { a.long.list[["something9973", exact=FALSE]] } )
也就是说,如果没有完全匹配的情况下进行部分匹配,则会发现$
实际上速度稍快一些。