【问题标题】:clojure map function being eager?clojure 地图功能急切?
【发布时间】:2011-02-28 09:57:32
【问题描述】:

根据 Mark 的精彩教程页面,“map 函数应用给定函数,该函数将一个参数用于集合中的每个项目,返回结果的惰性序列”。

当我执行以下操作时:

(def input-message-list (range 100 126))

(defn test-123 [in]
  (println "doing " in)
  (str "out " in))

(def output-test (map
                   test-123
                   input-message-list))

(first output-test)

,在 REPL 中,我得到了整个范围的 println 副作用,而不仅仅是第一个元素!

这里发生了什么事?

【问题讨论】:

    标签: map clojure jvm lazy-evaluation


    【解决方案1】:

    已经在here回复:

    实际上一次评估 32 个元素

    您的范围中的元素少于 32 个。

    【讨论】:

      【解决方案2】:

      这是分块序列的一部分,它确实有助于提高 Clojure 中普遍存在的“map overlazy seq”模式的性能。这样,您的映射函数会获得更多的连续调用,并使其更快地进入 JVM 热点编译器的快速路径。 Rich 于 2008 年在旧金山演示此功能时,看到这两段代码以相同的速度运行真是令人惊讶:

      (reduce + (map inc (range 10000)))
      

      (loop [i 0 sum 0]
         (recur (inc i) (+ sum i)))
      

      现在您可以编写 idomatic clojure 并获得全速。如果出现问题,您可以将其关闭here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 2011-05-28
        • 2011-12-16
        相关资源
        最近更新 更多