Jon*_*n M 42 performance r list subset
我一直在研究一些项目,这些项目要求我做很多列表子集,而在分析代码时,我意识到对象[["nameHere"]]方法对子集化列表的方法通常比对象$ nameHere方法更快.
例如,如果我们创建一个包含命名组件的列表:
a.long.list <- as.list(rep(1:1000))
names(a.long.list) <- paste0("something",1:1000)
Run Code Online (Sandbox Code Playgroud)
为什么是这样:
system.time (
for (i in 1:10000) {
a.long.list[["something997"]]
}
)
user system elapsed
0.15 0.00 0.16
Run Code Online (Sandbox Code Playgroud)
比这更快:
system.time (
for (i in 1:10000) {
a.long.list$something997
}
)
user system elapsed
0.23 0.00 0.23
Run Code Online (Sandbox Code Playgroud)
我的问题是这种行为是否真的普遍存在,我应尽可能避免使用$ subset,还是最有效的选择取决于其他一些因素?
小智 9
函数[[
首先遍历所有尝试精确匹配的元素,然后尝试进行部分匹配.该$
函数依次尝试对每个元素进行精确匹配和部分匹配.如果你执行:
system.time (
for (i in 1:10000) {
a.long.list[["something9973", exact=FALSE]]
}
)
Run Code Online (Sandbox Code Playgroud)
也就是说,你正在运行一个没有完全匹配的部分匹配,你会发现$
事实上它的速度要快得多.