小编Pra*_*ant的帖子

clojure"for"与"loop"的性能差异

以下两个函数都从2到(sqrt n),如果n是非素数,则一旦检测到它们就会停止

(defn is-prime-for? [n]
  (empty? (for [i (range 2 (math/sqrt (inc n)))
                :when (= 0 (rem n i))]
            i)))

(defn is-prime-loop? [n]
  (loop [i 2]
    (cond (> i (math/sqrt (inc n))) true
          (zero? (rem n i)) false
          :else (recur (inc i)))))
Run Code Online (Sandbox Code Playgroud)

那么为什么我们会看到它们之间的巨大性能差异呢?"循环"版本花费了近4倍的时间(在我的桌面上)

project-euler.prob010> (time (dorun (map is-prime-for? (range 200000))))
"Elapsed time: 3267.613099 msecs"
;; => nil
project-euler.prob010> (time (dorun (map is-prime-loop? (range 200000))))
"Elapsed time: 12961.190032 msecs"
;; => nil
Run Code Online (Sandbox Code Playgroud)

performance clojure

1
推荐指数
1
解决办法
433
查看次数

标签 统计

clojure ×1

performance ×1