【问题标题】:rbind + setkey in data.table slower than xts::rbind which automatically indexes?data.table 中的 rbind + setkey 比自动索引的 xts::rbind 慢?
【发布时间】:2014-12-05 07:40:56
【问题描述】:

在更新(=rbind)新行时,data.tablexts 慢近 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


【解决方案1】:

试试

rbindlist( rep( list(DT), 10 ))

rbindlist 应该会显着提升您的运行时间。

【讨论】:

  • 请注意,模拟的每一步都需要从DT的每个中间总结中收集反馈,因此rbindlist( rep( list(DT), 10 ))DT = setkey(rbindlist(list(DT, DT)), Date)不一样
  • 我还用rbindlist添加了第三个测试,改进只是微不足道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2018-12-02
  • 2013-02-07
  • 1970-01-01
  • 2019-01-03
相关资源
最近更新 更多