18

我正在阅读 1.5 中引入的 clojure reducers,这里是:https ://github.com/clojure/clojure/blob/master/changes.md 。我的理解是,它们是对现有 map/filter/reduce 函数的性能增强。所以如果是这样的话,我想知道为什么它们在一个新的命名空间中,而不是简单地替换现有的 map/reduce/filter 实现。换句话说,我为什么选择使用新的减速器功能?

编辑:

针对最初的两个答案,这里是一个澄清:

我将在这里引用发行说明:

Reducers 提供了一组用于处理集合的高性能函数。实际的折叠/减少算法是通过被减少的集合指定的。这允许每个集合定义最有效的方法来减少其内容。

这听起来不像新的 map/filter/reduce 函数本质上是并行的。例如,在发行说明中进一步说明:

它包含一个新函数 fold,它是一个并行 reduce+combine

因此,除非发行说明写得不好,否则在我看来,有一个新函数 fold,它是并行的,而其他函数是特定于集合的实现,旨在为特定集合产生尽可能高的性能。我只是误读了这里的发行说明吗?

4

4 回答 4

9

前言:你有问题,你将使用并行,现在问题二有你。

从某种意义上说,它们是替代品(与普通的旧顺序图等相比)。并非所有操作都可以并行化(在许多情况下,操作必须至少是关联的,还要考虑惰性序列和迭代器)。此外,并非每个操作都可以有效地并行化(总是有一些协调开销,有时开销大于并行化增益)。

于 2013-04-17T17:38:35.743 回答
8

在某些情况下,它们不能替换旧的实现。例如,如果您有无限序列,或者您实际上需要对集合进行顺序处理。

于 2013-04-17T17:37:54.183 回答
1

您可能决定不使用减速器的几个很好的理由:

  • 您需要保持与 Clojure 1.4的向后兼容性。这使得在库代码中使用 reducer 变得很棘手,例如,您不知道您将使用哪个 Clojure 版本
  • 在某些情况下,有更好的选择:例如,如果您正在处理数字数组,那么使用core.matrix之类的东西几乎肯定会更好。
于 2013-04-18T05:51:21.937 回答
0

我发现 Rich Hickey 写的以下文章虽然仍然有些令人困惑,但为我清除了(一些)事情: http: //clojure.com/blog/2012/05/08/reducers-a-library-and-model- for-collection-processing.html

特别是总结:

通过采用另一种将集合视为可简化而不是可排序事物的观点,我们可以获得一组互补的基本操作,这些操作在延迟与并行性之间进行权衡,同时保留相同的高级函数式编程模型。由于两个模型保持相同的形状,我们可以轻松地选择适合手头任务的模型。

于 2013-04-18T04:14:19.487 回答