Обычно я использую функциональную форму `:=`()
для вычисления нескольких столбцов в data.table
, думая, что это самый эффективный метод. Но недавно я обнаружил, что это медленнее, чем просто многократное использование :=
. По крайней мере, на моем компьютере.
Я предполагаю, что могут быть некоторые накладные расходы с функциональной формой :=
но это вся причина, почему это медленнее? Я просто из любопытства спрашиваю, чтобы лучше понять внутренности data.table
.
library(data.table)
n <- 5000000
dt <- data.table(a = rnorm(n),
b = rnorm(n),
c = rnorm(n))
dt_a <- copy(dt)
system.time({
dt_a[, d := a + b]
dt_a[, e := b + c]
dt_a[, f := a + c]
})
#> user system elapsed
#> 0.076 0.060 0.136
dt_b <- copy(dt)
system.time({
dt_b[, ':='(d = a + b,
e = b + c,
f = a + c)]
})
#> user system elapsed
#> 0.096 0.116 0.211
Обновить:
Одним интересным свойством этого является то, что разница во времени между :=
и `:=`()
является относительной примерно в 1,5-2 раза. Если бы это было просто из-за служебной нагрузки, как некоторые предполагают, я бы заподозрил разницу во времени быть фиксированным значением?
library(data.table)
n <- 20000000
dt <- data.table(a = rnorm(n),
b = rnorm(n),
c = rnorm(n))
dt_a <- copy(dt)
system.time({
dt_a[, d := a + b]
dt_a[, e := b + c]
dt_a[, f := a + c]
})
#> user system elapsed
#> 0.163 0.208 0.371
dt_b <- copy(dt)
system.time({
dt_b[, ':='(d = a + b,
e = b + c,
f = a + c)]
})
#> user system elapsed
#> 0.284 0.404 0.688