【问题标题】:Is there a performance advantage to multiple data.table assignments in one statement?一个语句中的多个 data.table 分配是否有性能优势?
【发布时间】:2016-03-14 22:58:51
【问题描述】:

data.table 中,以下具有等价的结果:

dt1 <- data.table(iris)
dt1[, Long.Petal := Petal.Length > mean(Petal.Length)]
dt1[, Wide.Petal := Petal.Width > mean(Petal.Width)]

dt2 <- data.table(iris)
dt2[, `:=`(
  Long.Petal = Petal.Length > mean(Petal.Length),
  Wide.Petal = Petal.Width > mean(Petal.Width)
)]

在处理大型数据集时,后一种形式是否有性能优势(在内存或运行时间或两者方面)?还是开销最小,只是样式和可读性的问题?

【问题讨论】:

  • 第三种形式可以使用 chaning dt3[, Long.Petal := ...][, Wide.Petal := ...] 但这可能会导致与 dt1 相同的开销。

标签: r performance data.table variable-assignment


【解决方案1】:

需要考虑的事情是 a) 对 [.data.table 的调用,以及 b) 在 [.data.table 中运行代码。

对于几个电话,它应该不会真正影响。但是,如果您这样做 100 次或 1000 次(例如,使用 for 循环),那么它的性能可能会降低.. 主要是由于调度 [.data.table 的时间。在这种情况下,只要没有分组,set() 就是更好的选择。

在任何情况下,这些东西都很容易在您的数据集上为您自己进行基准测试。致电Rprof(); &lt;your_code&gt;; Rprof(NULL); summaryRprof() 应该可以了解所花费的时间以及大部分时间都花在了哪里。

【讨论】:

  • 感谢set 的提示,我以前从未真正使用过。
  • @Arun 我发现我的答案中的基准非常令人惊讶。我本来预计时间会以&lt;&gt; 所花费的时间为主,因此预计不会有任何差异。
【解决方案2】:

我很惊讶以下示例中实际上存在不可忽略的性能差异。而且不赞成合并作业:

set.seed(42)
dt1 <- data.table(x = rnorm(1e7))
dt2 <- copy(dt1)

library(microbenchmark)

microbenchmark({dt1[, y := x < 0]; dt1[, z := x > 0]},
               dt2[,`:=`(
                 y = x < 0,
                 z = x > 0
               )])
#Unit: milliseconds
#                                                   expr      min       lq     mean   median       uq      max neval cld
#{     dt1[, `:=`(y, x < 0)]     dt1[, `:=`(z, x > 0)] } 122.6285 124.0237 143.3914 125.2057 146.0050 305.3609   100  a 
#                      dt2[, `:=`(y = x < 0, z = x > 0)] 153.2545 156.5720 208.5669 178.9714 301.8305 359.2821   100   b

all.equal(dt1, dt2)
#[1] TRUE

【讨论】:

  • 哈,我认为是因为引用计数。在第一种情况下,表达式计算为原子向量(使用 NAM(1)),即在每个赋值中都没有 RHS 的副本。在第二种情况下,由于它是一个列表,因此需要复制它(由于R 在引用计数方面的局限性)我想......很好!也许我们可以在内部针对某些情况进行优化.. 绝对应该提交 FR。
  • @Roland,你可以添加链接
猜你喜欢
  • 1970-01-01
  • 2011-12-18
  • 2017-02-26
  • 2011-04-02
  • 2015-01-30
  • 1970-01-01
  • 2011-12-07
  • 2015-01-09
  • 2013-06-01
相关资源
最近更新 更多