R data.table性能问题:获取vs[]],就地计算

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[条件

考虑以下代码段:

输出 0.002342 0.001131 0.002389

询问 1.getcol是否比dt[[col]]慢? 2.无论计算多么复杂,矢量化是否能更好地在整个数据上执行,而不是在子集上执行?
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)