【发布时间】:2014-12-05 07:40:56
【问题描述】:
在更新(=rbind)新行时,data.table 比 xts 慢近 6 倍的原因是什么?
library(quantmod); library(xts); library(data.table)
XTS = getSymbols("AAPL", from="2000-01-01", env = NULL)
# make corresponding `data.table`:
DT <- as.data.table(as.data.frame(XTS))
DT[, Date:=index(XTS)]
setkey(DT,Date)
setcolorder(DT,c("Date",names(XTS)))
# Note: rerun the above before running each test.
system.time(for(i in 1:10) XTS = rbind(XTS, XTS)) # reindexing is automatic
# user system elapsed
# 0.15 0.03 0.47
system.time(for(i in 1:10) DT = setkey(rbind(DT, DT), Date)) # need to manually reset key
# user system elapsed
# 0.64 0.02 2.30
system.time(for(i in 1:10) DT = setkey(rbindlist(list(DT, DT)), Date)) # ditto
# user system elapsed
# 0.60 0.02 2.20
data.table(与 xts 不同)甚至会耗尽我计算机上 i>15 的内存分配。
常见的编程用例是当您运行时间模拟并希望将中间测量值收集到结果表中,稍后您想对其进行总结。
【问题讨论】:
-
我可以从哪里安装
blotter? -
@Arun 啊,对不起,
quantmod而不是blotter- 这只是为了通过quantmod::getSymbols快速获取数据。我编辑了问题。 -
你不能先把它们收集起来,最后再绑定+setkey一次,就像Beasterfield展示的那样吗?我看到
rbind.xts是用 C 实现的,如果重新索引是在同一步骤中完成的,那么它会更有效地完成。在 DT 中,我们必须先绑定,然后重新排列。我会尽量避免以这种方式使用它。您必须以这种方式更新吗? -
@Arun,不幸的是,模拟需要在每一步从汇总的 DT 中收集反馈并重新参数化。这是设计上依赖路径的仿真,下一步取决于上一步
-
是的,如果你能提交一份(链接到这篇文章),那就太好了!也许标题“data.table 中的 rbind + setkey 比自动索引的 xts::rbind 慢”更好?
标签: r data.table xts