【问题标题】:Making a list "unlazy" in clojure在 clojure 中制作一个“不懒惰”的列表
【发布时间】:2012-04-09 13:00:43
【问题描述】:

我最近注意到这里有一个非常清晰的插入排序实现:

Insertion sort in clojure throws StackOverFlow error

  • 由于 concat 延迟加入列表而遭受内存溢出。我想知道:

当我们想要在大型集合上获得更好的性能时,我们可以应用哪些策略来“去延迟”列表?

【问题讨论】:

  • 嗯...经过一番谷歌搜索,很明显这个问题的简单答案是使用“doall”函数来包装集合。但是,我认为这里可能存在一些可能对了解有用的问题。

标签: clojure evaluation lazy-evaluation


【解决方案1】:

doall 对于强制惰性求值当然没问题。

要记住的另一件有用的事情是reduce 是非懒惰的。因此,这在大型计算中非常有用,可确保在计算继续之前对中间结果进行评估并减少到单个输出值。

【讨论】:

  • 我不太理解反对票。 doall 将完成这项工作,并且将 reduce 累积到向量中也提供了一个解决方案,不应立即将其解雇。结果具有快速随机访问,这对于某些应用程序可能很有趣。 (也就是说:在结果序列周围加上vec 也会给出相同的结果。)
  • 我同意一切都会奏效......事实上,它确实有效,我在发布这个问题后就尝试过,关于其他引用的帖子。请发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
相关资源
最近更新 更多