test <- data.table(x=sample.int(10, 1000000, replace=TRUE))
y <- test$x
test[,.N, by=x] # fast
test[,.N, by=y] # extremely slow
为什么在第二种情况下它很慢?
这样做甚至更快:
test[,y:=y]
test[,.N, by=y]
test[,y:=NULL]
看起来好像优化得很差?
test <- data.table(x=sample.int(10, 1000000, replace=TRUE))
y <- test$x
test[,.N, by=x] # fast
test[,.N, by=y] # extremely slow
为什么在第二种情况下它很慢?
这样做甚至更快:
test[,y:=y]
test[,.N, by=y]
test[,y:=NULL]
看起来好像优化得很差?
好像忘记更新这个帖子了。
固定
#5106
whereDT[, .N, by=y]
是y
带有 的向量length(y) = nrow(DT)
,但y
不是 中的列DT
。感谢您colinfang
的报告。
require(data.table)
test <- data.table(x=sample.int(10, 1000000, replace=TRUE))
y <- test$x
system.time(ans1 <- test[,.N, by=x])
# user system elapsed
# 0.015 0.000 0.016
system.time(ans2 <- test[,.N, by=y])
# user system elapsed
# 0.015 0.000 0.015
setnames(ans2, "y", "x")
identical(ans1, ans2) # [1] TRUE