Performance 具有惰性序列的突然减速

Performance 具有惰性序列的突然减速,performance,clojure,lazy-sequences,Performance,Clojure,Lazy Sequences,我有这个密码: :history (cons [t (:latest thing)] (take n (:history thing)) ) 这是为了在我的程序的每次迭代中向地图添加一个最近历史的滚动窗口。我发现,经过一定次数的迭代(~50次)后,我的程序将显著地、渐进地减慢 鉴于,如果我将代码更改为: :history (cons [t (:latest thing)] (take n (vec (:history thing))) ) 然后,程序在每次迭代中运行的时间稍长一些(正如laz

我有这个密码:

:history
(cons [t (:latest thing)] (take n (:history thing)) )
这是为了在我的程序的每次迭代中向地图添加一个最近历史的滚动窗口。我发现,经过一定次数的迭代(~50次)后,我的程序将显著地、渐进地减慢

鉴于,如果我将代码更改为:

:history
(cons [t (:latest thing)] (take n (vec (:history thing))) )
然后,程序在每次迭代中运行的时间稍长一些(正如lazy seq所实现的那样),但运行的一致性并没有降低速度


作为Clojure的新手,我不明白……这与分块序列有关吗?

我认为程序减速的意思是说“由于第一个代码示例所做的操作可能会导致序列变大,因此这个惰性序列的消耗会变慢”。这是因为,当您使用诸如cons之类的惰性运算符构建惰性序列时,它会创建一个操作链(函数)来生成序列,并且每次使用此惰性序列时,都会执行此操作链,例如:50个cons操作将创建50个链式函数调用,每次使用序列时都会执行,这显然比使用50个元素的向量并使用它要慢


在第二种情况下,惰性序列将只有一个操作(即cons),其余的将是从已经实现的向量(即向量调用)中执行的操作。

好的,我可以理解为什么第一种情况不好,但是为什么只有在达到一定的迭代次数时才会减速?这是因为卡盘序列吗?事实上,现在我很困惑,第一个案例是不是很糟糕?每次我使用序列时,是否都会执行所有这些嵌套cons操作?当然,因为我每次取n,所以序列只包含这n项。这在另一方面是不好的,这是一种浪费的方式,无论如何-我应该采取其余的和猜测或其他什么,所以我不需要这些n迭代为采取。