Hai, yang di sana!
Untuk banyak grup berbeda di by
, shift
jauh lebih lambat daripada pemindahan manual.
Lihat: http://stackoverflow.com/questions/35179911/shift-in-data-table-v1-9-6-is-slow-for-many-groups
dan https://github.com/nachti/datatable_test/blob/master/leadtest.R untuk contoh mendetail.
Bersulang,
Gerhard
Itu tidak mengejutkan. Ini akan hilang ketika gforce
dioptimalkan untuk :=
. Itu ada dalam daftar untuk rilis ini, saya percaya.
+1 untuk peningkatan kinerja ini. shift()
adalah hambatan utama dalam banyak kode saya. Tampaknya untuk jumlah baris yang tetap, waktu yang diperlukan untuk menjalankan shift()
sebanding dengan jumlah grup dalam data.
library(data.table)
# Build table to store timings
timings <- CJ(RowCount = 10^7, Groups = 10^c(0:7))
timings[, SizePerGroup := RowCount/Groups]
# Loop through each experiment
for(i in 1:nrow(dt)){
print(paste0("Iteration: ", i))
# Build dataset
timings_i <- timings[i]
dt <- data.table(Grp = rep(seq_len(timings_i$Groups), each = timings_i$SizePerGroup))
dt[, Value := sample(100, size = .N, replace = T)]
# Measure the time it takes to insert a column indicating the previous value by group
elapsed <- system.time(dt[, PrevValueByGrp := shift(Value, type = "lag"), by = Grp])["elapsed"]
timings[i, Elapsed := elapsed]
}
library(ggplot2)
ggplot(timings, aes(x = Groups, y = Elapsed))+geom_line()+geom_point()
@ben519 Fyi, untuk kasus khusus ketika kode Anda terlihat seperti itu, ada jalan pintas:
library(data.table)
dt <- data.table(Grp = rep(seq_len(1e6), each=10L))
dt[, Value := sample(100L, size = .N, replace = TRUE)]
system.time(dt[, PrevValueByGrp := shift(Value, type = "lag"), by = Grp][])
# user system elapsed
# 19.50 0.80 20.34
system.time(dt[, v := shift(Value, type = "lag")][rowid(Grp)==1L, v := NA][])
# user system elapsed
# 1.00 0.87 1.25
dt[, all.equal(v, PrevValueByGrp)]
# [1] TRUE
Komentar yang paling membantu
@ben519 Fyi, untuk kasus khusus ketika kode Anda terlihat seperti itu, ada jalan pintas: