gpt4 book ai didi

r - 基准测试:使用 `expression` `quote` 或都不使用

转载 作者:行者123 更新时间:2023-12-02 01:37:29 26 4
gpt4 key购买 nike

通常,当我运行基准测试时,我将语句包装在表达式中。最近,有人建议 (a) 不这样做或 (b) 使用 quote 而不是表达式。

我发现包装语句有两个优点:

  • 与整个语句相比,它们更容易被替换。
  • 我可以应用一系列输入,并比较这些结果

但是,在探索不同的方法时,我注意到这三种方法之间存在差异(用表达式换行、用quote换行或根本不换行)

问题是:
为什么会出现差异?
(似乎用 quote 换行实际上并没有评估调用。)

示例:

# SAMPLE DATA
mat <- matrix(sample(seq(1e6), 4^2*1e4, T), ncol=400)

# RAW EXPRESSION TO BENCHMARK IS:
# apply(mat, 2, mean)

# WRAPPED EXPRESSION:
expr <- expression(apply(mat, 2, mean))
quot <- quote(apply(mat, 2, mean))

# BENCHMARKS
benchmark(raw=apply(mat, 2, mean), expr, quot)[, -(7:8)]
# test replications elapsed relative user.self sys.self
# 2 expr 100 1.269 NA 1.256 0.019
# 3 quot 100 0.000 NA 0.001 0.000
# 1 raw 100 1.494 NA 1.286 0.021


# BENCHMARKED INDIVIDUALLY
benchmark(raw=apply(mat, 2, mean))[, -(7:8)]
benchmark(expr)[, -(7:8)]
benchmark(quot)[, -(7:8)]

# results
# test replications elapsed relative user.self sys.self
# 1 raw 100 1.274 1 1.26 0.018
# test replications elapsed relative user.self sys.self
# 1 expr 100 1.476 1 1.342 0.021
# test replications elapsed relative user.self sys.self
# 1 quot 100 0.006 1 0.006 0.001

最佳答案

您的问题是 quote 不会生成表达式,而是生成调用,因此在对基准的调用中,没有要评估的表达式。

如果您评估`调用,它实际上会被评估,并且时间安排是合理的。

class(quot)
[1] "call"
>class(expr)
[1] "expression"


benchmark(raw=apply(mat, 2, mean), expr, eval(quot))[, -(7:8)]
test replications elapsed relative user.self sys.self
3 eval(quot) 100 0.76 1.000 0.77 0
2 expr 100 0.83 1.092 0.83 0
1 raw 100 0.78 1.026 0.78 0

一般来说,我倾向于创建一个包含我希望进行基准测试的调用/进程的函数。请注意,最好包括将结果分配给值之类的内容。

例如

 raw <- function() {x <- apply(mat, 2, mean)}

在这种情况下,eval(quote(...)) 看起来有轻微的改进

benchmark(raw(), eval(quote(raw()))

test replications elapsed relative user.self sys.self
2 eval(quote(raw())) 100 0.76 1.000 0.75 0.01
1 raw() 100 0.80 1.053 0.80 0.00

但通常这些微小的差异可能是由于函数的开销造成的,并且可能无法反射(reflect)性能如何扩展到更大的问题。通过 data.table 解决方案的基准测试查看许多问题,使用少量复制,但大数据可能更好地反射(reflect)性能。

关于r - 基准测试:使用 `expression` `quote` 或都不使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13713116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com