小编jim*_*myc的帖子

Clojure 写入文件映射与 doseq

我需要根据 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 ... )
Run Code Online (Sandbox Code Playgroud)

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

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

time clojure map output

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

标签 统计

clojure ×1

map ×1

output ×1

time ×1