R语言如何为microbenchmark函数动态构建多个计时表达式
实现思路与可运行方案
- 明确
microbenchmark的参数规则:所有传入的命名参数都会被作为待计时的执行表达式,你需要做的核心是动态生成一组命名的未求值表达式列表,再传入函数即可,不需要用到复杂的Reduce或as.call,bquote+do.call的组合完全可以覆盖需求。 - 单条表达式生成:用
bquote构造未求值表达式,其中.()包裹的变量会被替换为当前环境的实际值,比如对应第i组参数的表达式写法为bquote(Sys.sleep(.(times[i])))。 - 批量生成表达式列表:用
lapply遍历所有下标批量生成表达式,再给列表设置expressions对应的名称即可。 - 动态执行计时:
do.call可以将列表作为参数批量传入函数执行,刚好适配动态参数的场景。
完整代码示例
library(microbenchmark) # 原始随机参数 n <- rpois(n = 1, lambda = 5) expressions <- LETTERS[rpois(n = n, lambda = 10)] times <- runif(n = n, max = 1e-5) # 批量生成待计时的表达式列表 expr_list <- lapply(seq_along(times), function(i) { bquote(Sys.sleep(.(times[i]))) }) # 为表达式设置自定义名称 names(expr_list) <- expressions # 动态调用microbenchmark执行计时 benchmark_result <- do.call(microbenchmark, expr_list) # 输出结果 print(benchmark_result)
如果需要验证生成的表达式是否符合预期,打印expr_list即可查看所有待执行的表达式内容。
内容的提问来源于stack exchange,提问作者schklom
相关产品推荐
相关产品推荐

