gpt4 book ai didi

Clojure:减少与应用

转载 作者:行者123 更新时间:2023-12-03 00:58:42 24 4
gpt4 key购买 nike

我理解reduceapply之间的概念差异:

(reduce + (list 1 2 3 4 5))
; translates to: (+ (+ (+ (+ 1 2) 3) 4) 5)

(apply + (list 1 2 3 4 5))
; translates to: (+ 1 2 3 4 5)

但是,哪一个是更惯用的 clojure 呢?一种方式或另一种方式有很大区别吗?从我的(有限的)性能测试来看,reduce 似乎有点快。

最佳答案

reduceapply 当然仅对于需要在可变数量情况下查看其所有参数的关联函数来说是等价的(就返回的最终结果而言) 。当它们在结果方面等效时,我会说 apply 总是完全惯用的,而 reduce 是等效的 - 并且可能会减少一小部分眨眼的时间眼睛——在很多常见情况下。以下是我相信这一点的理由。

+ 本身是根据可变数量情况(超过 2 个参数)的 reduce 实现的。事实上,对于任何可变数量的关联函数来说,这似乎是一种非常明智的“默认”方式:reduce有潜力执行一些优化来加快速度——也许通过类似的东西>internal-reduce,一个最近在 master 中禁用的 1.2 新颖性,但希望将来能够重新引入——在每个可能在 vararg 情况下受益的函数中复制它是愚蠢的。在这种常见情况下,apply只会增加一点开销。 (请注意,这没什么值得担心的。)

另一方面,复杂的函数可能会利用一些优化机会,这些优化机会不够通用,无法内置到 reduce 中;那么 apply 会让你利用这些优势,而 reduce 实际上可能会减慢你的速度。 str 提供了实践中发生的后一种情况的一个很好的例子:它在内部使用 StringBuilder ,并且将从 apply 的使用中受益匪浅。而不是减少

所以,我会说在有疑问时使用apply;如果您碰巧知道它不会给您带来任何超过 reduce 的东西(而且这种情况不太可能很快改变),请随意使用 reduce 来消除这个小问题如果您愿意的话,这是不必要的开销。

关于Clojure:减少与应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3153396/

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