【发布时间】:2015-06-03 14:58:47
【问题描述】:
我注意到对于 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
}
【问题讨论】:
-
我不知道data.table的内部结构,但我想添加新记录(行)比用新变量(列)重组表更容易。
-
@zx8754 是的,我也同意我的怀疑,很好奇具体的瓶颈是什么。也许是内存分配,也许是更大的内存需求,希望熟悉包细节的人能阐明..
-
除非我弄错了,否则在
data.table上调用rbind将调度rbind.data.table,它调用data.table函数rbindlist- 用C 实现,而且速度非常快。请参阅@Arun 的答案here。最重要的是,几乎可以肯定,按列修改和按行修改(关于对象如何存储在内存中)之间存在根本差异,因此这并不是真正的“苹果对苹果”的比较。这很可能是data.table实现:=以有效修改列的原因。 -
@andrew 因为基础
rbind和cbind不是通用的,data.table在加载时修改了这些基础函数。查看rbind.data.frame和cbind.data.frame的代码以了解发生了什么。 -
@MatthiasDiener 该链接似乎已过时。当前版本没有
cbind.data.table的帮助页面。
标签: r data.table