を選択し、のようなもの:のClojure clojure.setでフィルターセット/私はセットをフィルタリングしたいと思い対clojure.core /フィルタ
(filter-set even? #{1 2 3 4 5})
; => #{2 4}
私はclojure.core/filter
を使用している場合は、私ではない配列を取得しますセット:
(filter even? #{1 2 3 4 5})
; => (2 4)
だから私は付属の最高は次のとおりです。
(set (filter even? #{1 2 3 4 5}))
しかし、私はそれを好きではない、李にセットから行くために最適な見えません戻って設定する。これのためにClojurianの方法は何でしょうか?
UPDATE
私はA.Webbと@Beyamorアプローチ@比較するのに次のことをやりました。興味深いことに、どちらもほぼ同じパフォーマンスを示しますが、clojure.set/select
は若干優れています。
(defn set-bench []
(let [big-set (set (take 1000000 (iterate (fn [x] (int (rand 1000000000))) 1)))]
(time (set (filter even? big-set))) ; "Elapsed time: 422.989 msecs"
(time (clojure.set/select even? big-set))) ; "Elapsed time: 345.287 msecs"
nil) ; don't break my REPL !
'clojure.set/select'のパフォーマンスは'(set(filter ...)) 'とほぼ同じでなければなりません。大きなセットのタイミングを取ってみてください。 (1) 'filter'は実際には怠け者であり、(2)Clojureはすべて不変のデータ構造に関するリストなので、新しい構造を作成するという自然な嫌悪感を放棄しなければならないことに注意してください。 –
@A.Webb興味深い、質問の私の更新を見てください。 – Blacksad