我理解之间的概念差异reduce
and apply
:
(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
是有点快。
reduce
and apply
当然,仅对于需要在变量数量情况下查看所有参数的关联函数来说是等效的(就返回的最终结果而言)。当它们在结果方面是等效的时,我会说apply
总是完全惯用的,而reduce
在许多常见情况下,这是等效的 - 并且可能会减少眨眼的一小部分。以下是我相信这一点的理由。
+
本身是根据reduce
对于可变数量的情况(超过 2 个参数)。事实上,对于任何可变数量的关联函数来说,这似乎是一种非常明智的“默认”方式:reduce
有潜力执行一些优化来加快速度——也许通过类似的方法internal-reduce
,最近在 master 中禁用的 1.2 新颖性,但希望将来能够重新引入——在 vararg 情况下可能受益于它们的每个函数中复制它是愚蠢的。在这种常见的情况下,apply
只会增加一点开销。 (请注意,这没什么值得担心的。)
另一方面,复杂的函数可能会利用一些优化机会,这些机会不够通用,无法内置到reduce
; then apply
会让你利用这些reduce
实际上可能会减慢你的速度。实践中发生的后一种情况的一个很好的例子是str
: 它使用一个StringBuilder
内部并将大大受益于使用apply
而不是reduce
.
所以,我会说使用apply
有疑问时;如果你碰巧知道它不会给你带来任何好处reduce
(而且这不太可能很快改变),请随意使用reduce
如果您愿意的话,可以削减那些不必要的小开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)