这个问题是由 this problem 提示的。
考虑两个向量 a
和 b
,以及两个数据表 dt.a
和 dt.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
目标是计算公共(public)元素的数量。
我的问题 是:为什么数据表连接比
intersect(...)
慢 30 倍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 的威力会大放异彩。 [.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
关于r - 为什么 intersect(...) 比数据表连接快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20317947/