結果を変数に保存せずに、同じパラメーターで繰り返し使用する副作用のない関数があるとしましょう。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 回実行され、結果が使用されます。n
n
sort-by
n
それにもかかわらず、Clojure は結果を保存しますか? これらの方法は同等の速度ですか?