【发布时间】:2020-05-27 07:43:16
【问题描述】:
考虑以下代码 sn-p:
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. 是否应该在数据表之外进行一系列的计算,最终设置在列中而不是原地计算?
【问题讨论】:
标签: r performance data.table