我的算法如下 -Clojure的減速/圖不工作
(defn max-of
[args]
(into [] (apply map #(apply max %&) args)))
工作正常。
(max-of [[1 7] [3 5] [7 9] [2 2]])
返回[7 9]
它基本上發現上的各位置的最大元素。 7是最大的第一個元素是集合,9是最大的第二個元素。然而,試圖用reducer/map
從core.reducers
的時候,我得到
CompilerException clojure.lang.ArityException: Wrong number of args (21) passed to: reducers/map
所以這不起作用 -
(defn max-of
[args]
(into [] (apply r/map #(apply max %&) args)))
爲什麼?
UPDATE
我最後的代碼是
(defn max-of [[tuple & tuples]]
(into [] (r/fold (fn
([] tuple)
([t1 t2] (map max t1 t2)))
(vec tuples))))
運行快速板凳上它給Execution time mean : 626.125215 ms
我這有其他的算法,我寫之前 -
(defn max-fold
[seq-arg]
(loop [acc (transient []) t seq-arg]
(if (empty? (first t))
(rseq (persistent! acc))
(recur (conj! acc (apply max (map peek t))) (map pop t)))))
它做同樣的事情。對於這個我得到了 - Execution time mean : 308.200310 ms
這比r/fold平行的東西快兩倍。任何想法爲什麼?
順便說一句,如果我從r/fold
東西刪除into []
東西,那麼我得到Execution time mean : 13.101313 ms
。
猜測它給你這個結果沒有'into',因爲'fold'是懶惰的,所以減少不會發生,直到第一次使用結果 – leetwinski
也我認爲摺疊方法由於並行處理基礎架構開銷,這可能會因所提供的任務的複雜性而抵消。在你的情況下,任務是微不足道的。此外,「瞬態」方法是一個很好的優化,可能它是最正確的。 – leetwinski
感謝所有的見解 – Lordking