time - Clojure 写入文件映射与 doseq

标签 time map clojure output

我需要根据 Clojure 集合的元素将一些内容写入文件,我可以这样做——但我遇到了一些让我感到困惑的事情。可能是因为我不完全理解时间宏,但是当我执行以下操作时:

=> (def nums (take 100000 (repeatedly #(str (rand-int 1000) " "))))
   (defn out1 [nums] (doseq [n nums] (spit "blah1.txt" n :append true)))
   (defn out2 [nums] (map #(spit "blah2.txt" % :append true) nums))
#'test.core/nums
#'test.core/out1
#'test.core/out2
=> (time (out1 nums))
"Elapsed time: 19133.247 msecs"
nil
=> (time (out2 nums))
"Elapsed time: 0.209 msecs"
(nil nil nil nil ... )

使用 map (out2) 的实现运行速度明显更快。但是,当我转到文件夹并查看文件时,它会在给出 Elapsed time 后继续进行写入,并且 (nil ...) 输出会等到写入完成后才能显示。这让我相信他们实际上都在花费相同的时间。

那么,在这种情况下使用 doseq 和 map 有什么区别呢?哪种方式总体上会更好?谢谢

最佳答案

剂量q是渴望的(不是懒惰的)并且在你调用它时会做所有的工作。
map 是惰性的,并立即返回一个惰性序列,表示读取结果时将发生的工作。

因此,当 repl 打印 map 的结果(所有零值)而不是您正在计时的部分时, map 正在执行工作。要解决此问题,请调用 doalldorun各地调用map .

(time (doall (out2 nums)))

更重要的错误是您不打印结果(或以其他方式使用它),那么内容根本不会写入文件。一般用于纯粹的副作用操作 doseq可能是更好的选择。

关于time - Clojure 写入文件映射与 doseq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17797190/

相关文章:

java - 这次我该如何转换: "9:7.110" to "09:07.110"?

java.lang.IllegalStateException : Expected BEGIN_OBJECT but was STRING at line 1 column 62 错误

java - 在 Clojure 中模拟析构函数

java - 日历开始日期早于结束日期的同一天差异

java - 如何正确处理服务器端和客户端的时间节省问题

c - 如何获取 C 程序启动以来经过的毫秒数?

c++ - 按索引访问 map 值

ios - 打开具有特定地址 iOS 7 的 map

clojure - 文件更改时运行 Clojure REPL 命令

java - Processing(二维图形)是否适合大型项目?