【问题标题】:Why is intersect(...) faster than data table join?为什么 intersect(...) 比数据表连接快?
【发布时间】:2013-12-01 22:18:23
【问题描述】:

这个问题是this problem提出的。

考虑两个向量ab,以及两个数据表dt.adt.b如下:

a <- c(55, 1:25)
b <- c(55,30:40)

library(data.table)
dt.a <- data.table(x=a,key="x")
dt.b <- data.table(x=b,key="x")

intersect(a,b)
[1] 55
dt.a[dt.b,nomatch=0]
    x
1: 55

目标是计算共同元素的数量。

我的问题是:为什么数据表连接比intersect(...)慢30X

system.time(for (i in 1:1000){intersect(a,b)})
   user  system elapsed 
   0.05    0.00    0.04 
system.time(for (i in 1:1000){dt.a[dt.b,nomatch=0]})
   user  system elapsed 
   1.68    0.00    1.69 

【问题讨论】:

  • 对于小数据,[.data.table 的开销可能是一个主要因素。尝试更大的数据。此外,joins 在设计时考虑了超过 1 列。

标签: r data.table


【解决方案1】:

当遇到“大”问题时,data.table 的威力会大放异彩。 [.data.table 的开销将使实际花费在二分搜索组件上的时间相形见绌。

如果你给它一个“大”问题,那么data.table 将会扩展,你会看到差异。

# a "bigger" problem
a <- c(55, 1:25e6)
b <- c(55,30:40e6)

library(data.table)
dt.a <- data.table(x=a,key="x")
dt.b <- data.table(x=b,key="x")

library(microbenchmark)

microbenchmark(intersect(a,b), dt.a[dt.b, nomatch=0],times=5)
## Unit: seconds
##                     expr      min       lq   median       uq      max neval
##          intersect(a, b) 6.848245 6.897009 6.962055 7.052095 7.058509     5
##  dt.a[dt.b, nomatch = 0] 3.629062 3.654269 3.685051 3.721983 3.815155     5

【讨论】:

  • 谢谢!所以答案似乎是[data.table 的开销相当大。当我为长度为 O(25,000) 的向量重新运行基准测试时,intersect(...) 仍然获胜!
  • @jlhoward -25000 不是特别大。 [.data.table 具有函数本身的开销以及与 R 中的 s3 方法分派相关的开销。我建议后者贡献最大。
猜你喜欢
  • 2014-02-20
  • 2011-01-20
  • 2011-11-10
  • 2013-07-11
  • 2017-06-17
  • 2014-03-26
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多