В чем причина того, что data.table
почти в 6 раз медленнее, чем xts
, при обновлении (= rbind) новых строк?
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
? - person Arun   schedule 10.10.2014quantmod
вместоblotter
- это просто для быстрого получения данных черезquantmod::getSymbols
. Я отредактировал вопрос. - person Daniel Krizian   schedule 10.10.2014rbind.xts
реализовано на C, и если переиндексация делается на том же шаге, то делает это эффективнее. В DT мы должны сначала связать, а затем переставить. Я бы постарался не использовать его таким образом. Вы должны обновлять таким образом? - person Arun   schedule 10.10.2014rbindlist
должен затем реализовать дополнительный аргументkey
, чтобы возвращать результаты уже в отсортированном порядке. Я не уверен, как еще вы можете получить такую же производительность, как xts::rbind - person Arun   schedule 10.10.2014