为什么intersect(…)比数据表联接快?

为什么intersect(…)比数据表联接快?,r,data.table,R,Data.table,这一问题的提出是出于以下原因 考虑两个向量,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 当遇到“大”问题时,dat

这一问题的提出是出于以下原因

考虑两个向量,
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

当遇到“大”问题时,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
产生的开销可能是一个主要因素。在较大的数据上尝试一下。此外,
连接
的设计考虑了不止一列。谢谢!所以答案似乎是
[data.table
的开销相当大。当我重新运行长度为O(25000)的向量的基准测试时,
intersect(…)
仍然获胜!@jlhoward-25000不是特别大。
[.data.table
有函数本身的开销以及与R中s3方法调度相关的开销。我认为后者贡献最大。
# 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