【问题标题】:Apply reduce for each element of seq对 seq 的每个元素应用 reduce
【发布时间】:2017-06-20 20:50:26
【问题描述】:

我有列表集合,我想为集合中的每个列表应用“减少 +”。我想我应该结合“应用”、“地图”和“减少+”,但我不明白怎么做。 例子: [[1 2 3] [4 5 3] [2 5 1]] => [6 12 8]

【问题讨论】:

    标签: clojure reduce


    【解决方案1】:

    不需要applymapreduce 可以正常工作:

    (map (partial reduce +) [[1 2 3] [4 5 3] [2 5 1]])
    

    map 将调用列表中每个成员的函数,partial 只是创建一个需要一个参数的“curried”版本的 reduce。也可以写成#(reduce + %)(fn [lst] (reduce + lst))

    更新

    您实际上也可以在此处使用 apply 代替 reduce(但不能同时使用两者):

    (map (partial apply +) [[1 2 3] [4 5 3] [2 5 1]])
    

    进一步更新

    如果您有任何性能问题,请参阅此答案中的 cmets,了解 @AlexMiller 提供的一些重要提示

    【讨论】:

    • reduce 是这两者之间的首选,并且可能更快,尤其是在子向量很大的情况下
    • @AlexMiller 我不同意这个建议。目前apply + 只是委托给reduce +,因此速度差异可以忽略不计,尤其是对于大型向量。正如stackoverflow.com/a/3153643/625403 所说,apply 始终可以选择委托给reduce,但可以利用一些无法减少的特殊优化;反之则不成立。
    • 我在这个答案中专门讨论了将 apply +reduce + 进行比较,而不是一般情况下(尽管在大多数情况下,我认为 reduce 比 apply 等价物更清晰、更快速)。正如您所提到的, apply 在这里只是开销,时间:gist.github.com/puredanger/88d0491cbb4dbf8fe98b3747963d0068
    • 另外可能值得一提的是,使用匿名函数语法可能比 partial 快得多(删除 var 调用,在某些情况下会影响内联)。对于此处的示例,我看到 (map (partial reduce +) ...) = 17 ns,但 (map #(reduce + %) ...) = 13 ns。
    • @AlexMiller 你能解释一下为什么 reduce 在这里更快吗?蒂亚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多