我注意到,对于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/

10-12 17:50