我注意到,对于data.tables,cbind比rbind需要更长的时间。这是什么原因呢?
> dt <- as.data.table(mtcars)
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- rbind(dt.new, dt)})
user system elapsed
0.237 0.012 0.253
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- cbind(dt.new, dt)})
user system elapsed
14.795 0.090 14.912
在哪里
timeit <- function(expr)
{
ptm <- proc.time()
expr
proc.time() - ptm
}
最佳答案
最终,我认为这归因于alloc.col
变慢,这是由于循环从列中删除了各种属性。我不确定为什么要这么做,也许阿伦(Arun)或马特(Matt)可以解释。
如下所示,cbind
的基本操作比rbind
快得多:
cbind.dt.simple = function(...) {
x = c(...)
setattr(x, "class", c("data.table", "data.frame"))
ans = .Call(data.table:::Calloccolwrapper, x, max(100L, ncol(x) + 64L), FALSE)
.Call(data.table:::Csetnamed, ans, 0L)
}
library(microbenchmark)
microbenchmark(rbind(dt, dt), cbind(dt, dt), cbind.dt.simple(dt, dt))
#Unit: microseconds
# expr min lq mean median uq max neval
# rbind(dt, dt) 785.318 996.5045 1665.1762 1234.4045 1520.3830 21327.426 100
# cbind(dt, dt) 2350.275 3022.5685 3885.0014 3533.7595 4093.1975 21606.895 100
# cbind.dt.simple(dt, dt) 74.125 116.5290 168.5101 141.9055 180.3035 1903.526 100
关于r - cbind vs rbind与data.table,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30623757/