Data.table: shift() di data.table v1.9.6 lambat untuk banyak grup

Dibuat pada 11 Feb 2016  ·  3Komentar  ·  Sumber: Rdatatable/data.table

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

GForce performance

Komentar yang paling membantu

@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

Semua 3 komentar

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()

screen shot 2018-11-10 at 1 08 15 pm

@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
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

alex46015 picture alex46015  ·  3Komentar

sengoku93 picture sengoku93  ·  3Komentar

arunsrinivasan picture arunsrinivasan  ·  3Komentar

MichaelChirico picture MichaelChirico  ·  3Komentar

jimhester picture jimhester  ·  3Komentar