私は並列qsortアルゴリズムを書いていますが、彼は一般的な実装よりも遅く動作しています。問題は関数「concat」にあると思います。アルゴリズムを高速化するには?
(defn qsort-orig [L]
(if (empty? L)
'()
(let [[pivot & l] L]
(concat (qsort-orig (for [y l :when (< y pivot)] y))
(list pivot)
(qsort-orig (for [y l :when (>= y pivot)] y))))))
(defn qsort [L]
(if (empty? L)
'()
(let [ [pivot & l] L
Left (for [y l :when (< y pivot)] y)
Right (for [y l :when (>= y pivot)] y)]
(concat (apply concat (pmap qsort
(if (list? Left)
Left
(list Left))))
(list pivot)
(apply concat (pmap qsort
(if (list? Right)
Right
(list Right))))))))
# for test
(time (qsort (repeatedly 10000 #(rand-int 10000))))
(time (qsort-orig (repeatedly 10000 #(rand-int 10000))))