rbind + setkey в data.table медленнее, чем xts::rbind, который автоматически индексирует?

В чем причина того, что 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 на моем компьютере.

Обычный случай использования программирования — это когда вы запускаете временное моделирование и хотите собрать промежуточные измерения в таблицу результатов, которую вы позже хотите обобщить.


person Daniel Krizian    schedule 10.10.2014    source источник
comment
Откуда я могу установить blotter?   -  person Arun    schedule 10.10.2014
comment
@ Арун ах, извините, quantmod вместо blotter - это просто для быстрого получения данных через quantmod::getSymbols. Я отредактировал вопрос.   -  person Daniel Krizian    schedule 10.10.2014
comment
Разве вы не можете сначала собрать их и, наконец, связать + setkey, как показал Бистерфилд? Я вижу, что rbind.xts реализовано на C, и если переиндексация делается на том же шаге, то делает это эффективнее. В DT мы должны сначала связать, а затем переставить. Я бы постарался не использовать его таким образом. Вы должны обновлять таким образом?   -  person Arun    schedule 10.10.2014
comment
@Arun, к сожалению, симуляция должна собирать обратную связь от суммированного DT на каждом этапе и перепараметризовать себя. Это симуляция, зависящая от пути, по дизайну, следующий шаг зависит от предыдущего шага.   -  person Daniel Krizian    schedule 10.10.2014
comment
Я предполагаю, что rbindlist должен затем реализовать дополнительный аргумент key, чтобы возвращать результаты уже в отсортированном порядке. Я не уверен, как еще вы можете получить такую ​​​​же производительность, как xts::rbind   -  person Arun    schedule 10.10.2014
comment
@Arun Я согласен, что для этого требуется реализация C, xts - хороший эталон для этого. Возможно, запрос функции?   -  person Daniel Krizian    schedule 10.10.2014
comment
Да, если вы можете подать один (ссылка на этот пост), это было бы здорово! Может быть, заголовок rbind + setkey в data.table медленнее, чем xts::rbind, который автоматически индексирует лучше?   -  person Arun    schedule 10.10.2014


Ответы (1)


Пытаться

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

rbindlist должен значительно увеличить время выполнения.

person Beasterfield    schedule 10.10.2014
comment
Обратите внимание, что каждый шаг симуляции должен собирать обратную связь от каждой промежуточной сводки DT, поэтому rbindlist( rep( list(DT), 10 )) не совпадает с DT = setkey(rbindlist(list(DT, DT)), Date). - person Daniel Krizian; 10.10.2014
comment
Я также добавил третий тест с rbindlist, и улучшение было незначительным. - person Daniel Krizian; 10.10.2014