2

結果を変数に保存せずに、同じパラメーターで繰り返し使用する副作用のない関数があるとしましょう。Clojure はこれに気付き、事前に計算された関数の値を使用しますか、それとも値は常に再計算されますか?

例:

(defn rank-selection [population fitness]
  (map
    #(select-with-probability (sort-by fitness population) %)
    (repeatedly (count population) #(rand))))

(defn rank-selection [population fitness]
  (let [sorted-population (sort-by fitness population)]
    (map
      #(select-with-probability sorted-population %)
      (repeatedly (count population) #(rand)))))

最初のバージョンでは-timessort-byが実行されます (ここで人口のサイズ)。2 番目のバージョンでは、1 回実行され、結果が使用されます。nnsort-byn

それにもかかわらず、Clojure は結果を保存しますか? これらの方法は同等の速度ですか?

4

2 に答える 2

1

Clojure では、シーケンスは遅延していますが、関数評価を含む言語の残りの部分は熱心です。Clojure は毎回関数を呼び出します。ランク選択関数の 2 番目のバージョンを使用します。

于 2013-06-10T15:52:00.300 に答える