Я заметил, что ленивые последовательности в 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: Проектирование ленивого вектора: проблема с константой