performance - R:为什么 [[ ]] 方法比使用 $ 更快地对列表进行子集化?

标签 performance r list subset

我一直在做一些需要我做很多列表子集的项目,在分析代码时我意识到 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 

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

最佳答案

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

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

即,您正在运行没有完全匹配的部分匹配,您会发现 $事实上,它稍微快了一点。

关于performance - R:为什么 [[ ]] 方法比使用 $ 更快地对列表进行子集化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16630087/

相关文章:

c++ - 为什么使用默认构造函数 “{}”而不是 “= default”会有性能差异?

r - 如何合并时间帧数据并为非重叠部分保留 NA?

python-3.x - 类型错误 : '<' not supported between instances of 'str' and 'int' in version numbers

arrays - 测试数组是否在 lisp 中的列表中

c# - 在 C# 与 SSMS 中使用 SqlDataReader.Read() 进行缓慢的 SQL 数据检索

Java GPU 编程

performance - Ionic - 可滚动的大图像列表 - 内存使用

r - 如何在 Windows 上从源 tarball 安装 R 包?

r - 成对比较的二进制编码

python - 从python中的列表和字典的复杂列表中提取元素