R data.table性能问题:获取vs[]],就地计算
考虑以下代码段: 输出 0.002342 0.001131 0.002389 询问 1.getcol是否比dt[[col]]慢? 2.无论计算多么复杂,矢量化是否能更好地在整个数据上执行,而不是在子集上执行?R data.table性能问题:获取vs[]],就地计算,r,performance,data.table,R,Performance,Data.table,考虑以下代码段: 输出 0.002342 0.001131 0.002389 询问 1.getcol是否比dt[[col]]慢? 2.无论计算多么复杂,矢量化是否能更好地在整个数据上执行,而不是在子集上执行? 3.是否应该在数据表之外执行一系列计算,并最终在列中设置,而不是就地计算?如果我使用所有内部构件并使用microbenchmark运行,它将以随机顺序执行每个计算,并报告一些良好的统计数据。我将预先计算tmp和条件 微基准::微基准 a={ dt[条件,a:=a-getcol] dt[条件
3.是否应该在数据表之外执行一系列计算,并最终在列中设置,而不是就地计算?如果我使用所有内部构件并使用microbenchmark运行,它将以随机顺序执行每个计算,并报告一些良好的统计数据。我将预先计算tmp和条件 微基准::微基准 a={ dt[条件,a:=a-getcol] dt[条件,a:=a-getcol2] }, b={
tmp如果我使用所有的内部组件并使用microbenchmark运行,它将以随机顺序执行每个组件,并报告一些良好的统计数据。我将预先计算tmp和条件 微基准::微基准 a={ dt[条件,a:=a-getcol] dt[条件,a:=a-getcol2] }, b={
tmp@jangorecki我们如何将语句d[condition,num:=num+5]转换为set。我们必须设置d,whichcondition,d$num[condition]+5.与第一次近似不同,我们需要再次指定条件并按数据表限定num,因此请注意计算条件一次,而不是两次。请注意,您缺少一个用于指定列的set参数,示例中使用num value。@jangorecki如何转换语句d[condition,num:=num+5]设置。我们是否必须设置d,即条件,d$num[condition]+5。我们需要再次指定条件,并根据数据表对num进行限定,这与第一次近似不同,因此请注意计算条件一次,而不是两次。请注意,您缺少一个set参数,该参数指定列,在您的示例中为num value。
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)