Clojure 的 'into' 是否保持领先?
Does Clojure's 'into' hold on to head?
我有一个非常大的惰性序列,我想将它转换成一个集合。我知道序列中不同元素的数量很少,所以我可以轻松地将集合装入内存。但是,我可能无法将整个惰性序列装入内存。我只想做 (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.
中查找行的时间
我有一个非常大的惰性序列,我想将它转换成一个集合。我知道序列中不同元素的数量很少,所以我可以轻松地将集合装入内存。但是,我可能无法将整个惰性序列装入内存。我只想做 (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.