我正在编写并行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))))
答案 0 :(得分:1)
这两者的内存分配时间很可能会消除它们之间的实时差异。
recur
中使用qsort-orig
,那么它不会快速烧掉堆栈并且应该运行得更快,因为它将花费更少的时间来分配内存。