Рассмотрим следующий фрагмент кода:
foo <- function(dt, num) {
expect_equal(class(num), "numeric")
col <- paste("b", num, sep = "_")
col2 <- paste("b", num + 1, sep = "_")
condition <- dt$a > 0
st <- nanotime(Sys.time())
dt[condition, a := a - get(col) ]
dt[condition, a := a - get(col2) ]
et <- nanotime(Sys.time())
diff <- (et - st) / 1e9
message(diff)
st <- nanotime(Sys.time())
tmp <- dt$a - dt[[col]]
tmp <- tmp - dt[[col2]]
dt[condition, a := tmp[condition]]
et <- nanotime(Sys.time())
diff <- (et - st) / 1e9
message(diff)
st <- nanotime(Sys.time())
dt[, tmp := a - get(col)]
dt[, tmp := a - get(col2)]
dt[condition, a := tmp]
et <- nanotime(Sys.time())
diff <- (et - st) / 1e9
message(diff)
}
dt <- data.table(c = 0, d = 0, e = 0, f = 0, g = 0, h = 0, i = 0, a = -15000:15000, b_1 = 1L, b_2 = 1L)
foo(dt, 1)
Выход 0,002342 0,001131 0,002389
Запросы 1. get(col)
медленнее, чем dt[[col]]
? 2. Является ли векторизация, какой бы сложной она ни была, лучше выполнять вычисления для всех данных, а не для их разделения? 3. Следует ли проводить серию вычислений вне таблицы данных и в конце задать ее в столбце, а не на месте вычислений?