r语言 - 试图成为基准 dplyr vs data.table



为什么这段代码不起作用?如何将这些与表达式进行基准测试?

library(data.table)
library(dplyr)
dt <- as.data.table(mtcars) 
(lb <- bench::mark(
  dt[, .N, by = .(am, gear) ],
  count(dt, am, gear)
))

all .equal.data.table(results$result[[1]], results$result[[i]]( 中的错误: "目标"和"当前"都必须是 data.tables

微基准测试包在这种情况下可以很好地工作。

library(data.table)
library(dplyr)
library(microbenchmark)
dt <- as.data.table(mtcars) 
microbenchmark::microbenchmark(
  dt = dt[, .N, by = .(am, gear) ],
  dplyr = count(dt, am, gear)
)
# Unit: microseconds
#   expr     min       lq      mean   median        uq       max neval
#     dt 366.895  441.917  666.3117  471.690  545.9255  8154.319   100
#  dplyr 934.658 1049.023 1649.7788 1144.242 1255.5120 29170.144   100

我更愿意理解为什么强制检查失败。

在这种情况下,差异是由

  • 不同的行顺序(data.table by =按出现顺序返回组,count()似乎默认对行进行排序(
  • 幕后的不同属性。

下面的代码修复了这两个问题,并且仍然检查结果:

library(data.table)
library(dplyr)
dt <- as.data.table(mtcars) 
(lb <- bench::mark(
  dt[, .N, keyby = .(am, gear)],
  count(dt, am, gear),
  check = function(x, y) all.equal(x, y, check.attributes = FALSE)
))
# A tibble: 2 × 13
  expression                         min   median `itr/sec` mem_alloc `gc/sec` n_itr  n_gc total_time result              
  <bch:expr>                    <bch:tm> <bch:tm>     <dbl> <bch:byt>    <dbl> <int> <dbl>   <bch:tm> <list>              
1 dt[, .N, keyby = .(am, gear)]  617.3µs  688.1µs    1333.     33.5KB     4.17   640     2      480ms <data.table [4 × 3]>
2 count(dt, am, gear)             9.04ms   10.7ms      93.8    10.7KB     2.09    45     1      480ms <data.table [4 × 3]>
# … with 3 more variables: memory <list>, time <list>, gc <list>

最新更新