在Clojure中优化合并

时间:2013-12-10 11:43:57

标签: clojure

以下适用于小型列表(< 500),但对于较大的列表(> 2500),它会无效地挂起。有没有更好的方法来实现这种效果而不失败?

(def errors '({:a-key
   ["some string"]}
  {:a-key
   ["some string"]}
  {:a-key
   ["some string"]}
  {:a-key
   ["some other string"]}))

(def unique-errors (apply merge-with (comp distinct into) errors))

;; =>  {:a-key ("some string", "some other string")}

1 个答案:

答案 0 :(得分:5)

我认为你的代码的主要问题并不是它很慢,而是导致堆栈溢出,因为每个新错误都会调用distinct一次,而且它很懒,所以在打印时结果,有很多“嵌套”distinct电话。

但无论如何:对不应包含重复项的内容使用集合。使用集合会导致以下情况,这会更快一点,并且不会导致堆栈溢出。

(def errors (repeat 5000 {:a-key #{"some string"}}))
(apply merge-with into errors)