0

我有这个代码:

:history
(cons [t (:latest thing)] (take n (:history thing)) )

这是为了在我的程序的每次迭代中将最近历史的滚动窗口添加到地图中。我发现,经过一定次数的迭代(约 50 次)后,我的程序会显着且渐进地减速。

而,如果我将代码更改为:

:history
(cons [t (:latest thing)] (take n (vec (:history thing))) )

然后程序在每次迭代中运行的时间稍长(因为正在实现惰性序列),但运行一致并且没有减慢。

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

4

1 回答 1

1

我认为程序减速的意思是说“由于您的第一个代码示例执行的可能的缺点操作,随着序列变得更大,这个惰性序列的消耗会减慢”。这是因为当你使用像 cons 这样的惰性操作符构建一个惰性序列时,它会创建一个操作链(函数)来生成序列,并且每次你使用这个惰性序列时都会执行这个操作链,例如:50 个 cons 操作将创建一个 50 个链式函数调用,每次您使用序列时都会执行该函数调用,这显然比拥有 50 个元素的向量并使用它要慢。

在您的第二种情况下,惰性序列将只有 1 个操作(即缺点),其余的将从已经实现的向量(即向量调用)中进行操作

于 2012-04-13T04:13:51.140 回答