【发布时间】:2015-08-05 16:26:23
【问题描述】:
我有一个非常大的惰性序列,我想将它转换成一个集合。我知道序列中不同元素的数量很少,因此我可以轻松地将集合放入内存中。但是,我可能无法将整个惰性序列放入内存中。我只想做(into #{} my-lazy-seq),但我突然想到,根据into 的实现方式,这可能会立即将整个seq 拉入内存。
into 会在运行时保持序列的头部吗?
【问题讨论】:
我有一个非常大的惰性序列,我想将它转换成一个集合。我知道序列中不同元素的数量很少,因此我可以轻松地将集合放入内存中。但是,我可能无法将整个惰性序列放入内存中。我只想做(into #{} my-lazy-seq),但我突然想到,根据into 的实现方式,这可能会立即将整个seq 拉入内存。
into 会在运行时保持序列的头部吗?
【问题讨论】:
我没有看到运行此程序的使用量有任何增加(需要一分钟左右)
user=> (into #{} (take 1e8 (cycle [:foo :bar])))
#{:bar :foo}
更准确的证明是检查the source 是否有into,我们发现这只是对reduce 的一个花哨的调用:
(defn into
([to from]
;...
(reduce conj to from)))
如果reduce 抓住了头部,那么into 可以。但我认为reduce 不会那样做。
【讨论】:
补充@progo 的答案,您可以随时使用
(source into)
查看repl中into的源代码。这可以节省您在加长的 core.clj 中查找行的时间。
【讨论】: