簡體   English   中英

試圖成為基准 dplyr 與 data.table

[英]Trying to be benchmark 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]]) 錯誤:'target' 和 'current' 必須都是 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM