为什么expand.grid比data.table的CJ更快?

Mic*_*ael 28 r data.table

> system.time(expand.grid(1:1000,1:10000))
   user  system elapsed 
   1.65    0.34    2.03 
> system.time(CJ(1:1000,1:10000))
   user  system elapsed 
   3.48    0.32    3.79 
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 29

感谢您报告此事.现在已在data.table 1.8.9中修复了这个问题.这是最新提交的时序测试(913):

system.time(expand.grid(1:1000,1:10000))
# user system elapsed
# 1.420 0.552 1.987

system.time(CJ(1:1000,1:10000))
# user system elapsed
# 0.080 0.092 0.171
Run Code Online (Sandbox Code Playgroud)

来自新闻:

CJ()在1e6行(例如)#4849上快90%.输入现在首先在组合之前进行排序,而不是在组合之后进行排序,并使用rep.int而不是rep(感谢Sean Garborg的想法,代码和基准),并且仅在is.unsorted(),#2321时进行排序.

另请查看NEWS以了解其他值得注意的功能并修复错误; 例如,也CJ()获得了新的sorted论点.


Mic*_*ael 7

Mnel的猜测是正确的.CJ返回一个data.table,其中每列都是一个键.

> DT <- CJ(1:100,1:100)
> key(DT)
[1] "V1" "V2"
Run Code Online (Sandbox Code Playgroud)

更公平的比较:

> system.time(CJ(1:1000,1:10000))
   user  system elapsed 
   3.40    0.25    3.73 
> system.time(data.table(expand.grid(1:1000,1:10000),key=c("Var1","Var2")))
   user  system elapsed 
   4.14    0.68    4.90 
Run Code Online (Sandbox Code Playgroud)

  • +1即使如此也会改善`CJ`; 在评论问题时链接到FR.顺便说一下,`as.data.table`应该比`data.table`快. (2认同)