对于这些查找表样式查询,为什么data.table比base R慢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于这些查找表样式查询,为什么data.table比base R慢?相关的知识,希望对你有一定的参考价值。

我正在尝试对我实际上不想修改的现有数据表对象进行一些简单过滤。我注意到它似乎比等效的R基本慢得多,如以下示例所示:

library(data.table)
dt <- data.table(
  label = sample(c("l1", "l2", "l3"), 300, replace = TRUE),
  x = rnorm(300)
)
df <- as.data.frame(dt)
all.equal(dt[label == "l3", x], df[df$label == "l3", "x"])

(bench <- microbenchmark::microbenchmark(
  dt_lookup = dt[label == "l3", x],
  df_lookup = df[df$label == "l3", "x"],
  mixed = dt[dt$label == "l3", "x"],
  times = 1000
))

产生]

Unit: microseconds
      expr    min     lq      mean median     uq    max neval
 dt_lookup 1159.2 1393.0 1529.4477 1451.6 1524.2 6487.9  1000
 df_lookup   17.3   25.2   33.8164   32.0   36.4  150.4  1000
     mixed  140.9  175.2  204.8512  193.9  220.7 1533.9  1000

即,基数R快30倍以上。

我在这里做错什么了吗?在这种情况下,索引和键似乎对性能没有太大影响。

我正在尝试对我实际上不想修改的现有数据表对象进行一些简单过滤。我注意到它似乎比基本R等效物慢得多,如下所示。

答案

代替子集data.frame,可以先用[[提取列,然后再对行进行子集化

另一答案

您可以使用更好的数据结构,例如list。在您的示例中,如果查询表是分层结构的,则无需每次都遍历整个向量:

以上是关于对于这些查找表样式查询,为什么data.table比base R慢?的主要内容,如果未能解决你的问题,请参考以下文章

当一个是查找表时如何加入 data.tables?

python 从HTML页面查找对外部脚本和样式表的引用,并打印这些文件的下载说明。

通过浏览器的审查元素功能查询当前代码源文件!

在外部样式表中查找 CSS 类的定义

链表适用于( )查找

R语言data.table导入数据实战:data.table使用dcast.data.table函数实现透视表(pivot table)