私は、Clojure の遅延シーケンスが内部的にリンクされたリストとして表されているように見えることに気付きました (または、少なくとも要素への順次アクセスのみを持つシーケンスとして扱われています)。メモリにキャッシュされた後でも、lazy-seq のアクセス時間nth
は O(n) であり、ベクトルのように一定時間ではありません。
;; ...created my-lazy-seq here and used the first 50,000 items
(time (nth my-lazy-seq 10000))
"Elapsed time: 1.081325 msecs"
(time (nth my-lazy-seq 20000))
"Elapsed time: 2.554563 msecs"
Clojure で一定時間のルックアップを取得したり、遅延ベクトルを段階的に作成したりするにはどうすればよいですか?
遅延ベクトルの生成中に、各要素がその前のすべての要素の関数であるため、リストの走査に費やされる時間が重要な要素になると想像してください。
関連する質問は、この不完全な Java スニペットのみを示しました: Designing a lazy vector: problem with const