有一些在 SO 上的答案进行了时间比较,但是没有检查结果。然而,我更喜欢看到一个表达式是否正确,并且速度快。
microbenchmark
包支持使用check
参数实现这一点。不幸的是,在通过引用更改 data.table
的表达式中,检查会失败,即检查无法识别结果已经不同。
Case 1: data.table表达式中,检查按预期工作的情况
library(data.table)
library(microbenchmark)
# minimal data.table 1 col, 3 rows
dt <- data.table(x = c(1, 1, 10))
# define check function as in example section of help(microbenchmark)
my_check <- function(values) {
all(sapply(values[-1], function(x) identical(values[[1]], x)))
}
基准测试案例旨在返回不同的结果。因此,
microbenchmark(
f1 = dt[, mean(x)],
f2 = dt[, median(x)],
check = my_check
)
按预期返回错误消息:
错误:输入表达式不等同。
情况2: data.table表达式未通过检查
现在,表达式已修改为通过引用更改dt
。请注意,仍然使用相同的检查函数。
microbenchmark(
f1 = dt[, y := mean(x)],
f2 = dt[, y := median(x)],
check = my_check
)
返回现在
expr min lq mean median uq max neval cld
f1 576.947 625.174 642.9820 640.7110 661.1870 732.391 100 a
f2 602.022 658.384 684.7076 678.9975 694.0825 978.600 100 b
因此,尽管这两个表达式不同,但结果的检查在此处失败了。(时间无关紧要。)
我明白,检查失败是因为参考已更改dt
。因此,比较每个表达式的结果时,总是引用最后更改状态中的相同对象。
问题
如何修改检查函数和/或表达式,使得即使在通过引用更改data.table
的情况下,检查也能可靠地检测到不同的结果?
copy()
的提示再加2分。 - Uwe