haskell - 用于大量串联和单次迭代的最快不可变列表数据结构

标签 haskell data-structures functional-programming immutability

我正在使用 Haskell。标准列表串联既幼稚又缓慢。我的情况是我有一个算法,可以多次构建单个列表连接(顺序无关紧要,因此可以是前置或附加或组合),然后返回它。结果将仅使用一次。高性能至关重要。

所以,这是一个非常简单的情况。我听说过差异列表,它有助于解决这种情况。但这是最好的选择吗?

列表可能会变得很大:100,000 个条目。

最佳答案

这是一个经验问题,应该根据经验来回答。合理的替代方案包括

  • 带有缺点的标准列表(在您的问题中称为“前置”)

  • 具有恒定时间附加的差异列表(John Hughes 列表)

  • 支持常量时间追加的代数数据类型:

    data Alist a = ANil | ASingle a | AAppend (Alist a) (Alist a)
    
  • 最终concat的列表列表。

所有这些都需要线性时间。但恒定因素很重要,找出答案的唯一方法是构建和衡量。如果您愿意,您可以创建一个完全忠实于原始代码的微基准测试,但通过将每个列表操作记录到编写器 monad 中,仅执行列表操作。但这可能是一个巨大的痛苦,而且不值得。相反,编写一个简单的基准测试,编译(打开优化),然后测量。

请让我们知道结果。

关于haskell - 用于大量串联和单次迭代的最快不可变列表数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494005/

相关文章:

haskell - makeLenses 和 makeFields 有什么区别?

haskell - .prof 报告中的 .(...) 是什么意思?

java - 给定整数集的子集,其和为常量 N : Java

用于调试日志记录的循环缓冲区

javascript - 是否有 ramda 函数可以帮助您将日志记录添加到管道/组合中?

Haskell初学者: "No instance for...arising from..." error

data-structures - 为了通用性和安全性,应该选择什么数据结构?

ruby - Proc 和 Lambda 之间的区别

functional-programming - 修改函数以忽略参数的函数的标准名称

haskell - 基于应用的表述的单子(monad)定律