如何将表达式传递给Bench::mark example参数

2wnc66cl  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(82)

假设我有一个包含函数的列表:

funcs <- list(
  loop = function(n) {
    result <- 0
    for (i in seq_len(n)) {
      result <- result + i
    }
    result
  },
  vect = function(n) sum(seq_len(n))
)

如果我想使用bench进行基准测试,我可以这样做:

N <- 1e6
bench::mark(funcs$loop(N), funcs$vect(N)) # Ok

这很好用然而,我有两个小nits与这种方法。
1.我需要记住为每个函数写一个表达式。例如,如果我向funcs添加一个函数,我需要记住也将其作为表达式添加到mark(...)
1.我还重复了函数的求值(即(N)重复了不止一次)。很明显,这是微不足道的,但它仍然是一种重复的形式。
似乎markexprs参数应该会有所帮助,它允许我执行以下操作:

bench::mark(exprs = lapply(funcs, \(f) expression(f(1e6)))) # Error in f(1e+06) : could not find function "f"

但是,它会生成错误。如何生成适合传递给exprs参数的列表?

mnemlml8

mnemlml81#

而不是使用expression(),需要使用subsititute()(如Konrad Rudolph所示)。但是,正如最初编写的那样,它捕获了错误的参数;重新分配给临时变量可以解决这个问题。下面的代码可以工作。

bench::mark(exprs = lapply(funcs, \(f) {
  g <- f
  substitute(g(1e6)) 
}))

相关问题