【发布时间】:2016-03-06 05:57:52
【问题描述】:
我已经使用 Clojure 的标准库实现了埃拉托色尼筛。
(defn primes [below]
(remove (set (mapcat #(range (* % %) below %)
(range 3 (Math/sqrt below) 2)))
(cons 2 (range 3 below 2))))
我认为这应该符合并行性,因为没有递归,并且可以删除 remove 和 mapcat 的 reducer 版本。这是我想出的:
(defn pprimes [below]
(r/foldcat
(r/remove
(into #{} (r/mapcat #(range (* % %) below %)
(into [] (range 3 (Math/sqrt below) 2))))
(into [] (cons 2 (range 3 below 2))))))
我已经将初始集合和生成的倍数倒入向量中,因为我知道 LazySeq 不能折叠。还有,最终实现集合使用r/foldcat。
我的问题是这比第一个版本慢了一点。
(time (first (primes 1000000))) ;=> approx 26000 seconds
(time (first (pprimes 1000000))) ;=> approx 28500 seconds
协调进程的开销是否过多,还是我使用减速器有误?
【问题讨论】:
标签: clojure parallel-processing primes sieve-of-eratosthenes reducers