Performance 手指树(Data.Sequence)与Rope(Data.Rope)(Haskell或一般)
a和Rope(Data.Rope)(或)之间的关键区别是什么 在Haskell库中,Data.Sequence有更多的函数。我认为rope处理“块”的效率更高 作为一名程序员,我考虑过处理700万字符序列的效率,我需要(a)在任何地方插入,(b)剪切和粘贴段(拼接),(c)搜索和替换子字符串,哪一种效率更高 针对ehird的澄清:Performance 手指树(Data.Sequence)与Rope(Data.Rope)(Haskell或一般),performance,haskell,data-structures,sequence,Performance,Haskell,Data Structures,Sequence,a和Rope(Data.Rope)(或)之间的关键区别是什么 在Haskell库中,Data.Sequence有更多的函数。我认为rope处理“块”的效率更高 作为一名程序员,我考虑过处理700万字符序列的效率,我需要(a)在任何地方插入,(b)剪切和粘贴段(拼接),(c)搜索和替换子字符串,哪一种效率更高 针对ehird的澄清: 我的算法的大部分运行着数千个搜索替换操作,比如s/(ome)?reg[3]x/blah$1/g,以重复变异数据。因此我需要高效的正则表达式模式匹配(可能是形式?以及拼
s/(ome)?reg[3]x/blah$1/g
,以重复变异数据。因此我需要高效的正则表达式模式匹配(可能是形式?以及拼接(数据[a:b]=newData),其中不一定(长度(newData)=b-a+1)
Char
s或Byte
s或Word8
s,甚至类似于假设的Word4
s(半字节)。
**我有一个相关的问题,关于如何有效地使用newtype
或数据
,以便我的代码可以引用抽象字母表,但编译的程序仍然可以有效。(我应该单独发布这个问题。)ByteString
,然后以60MB实际内存使用率打印到控制台峰值(根据Windows Process Manager),但将该内容加载到Seq Char
中,然后打印需要400MB!(我应该单独发布这个问题,并附带代码和分析细节。)cabal安装
(安装了不兼容版本的软件包,--user
vs--global
混乱),所以我想继续使用EclipseFP可以找到的平台软件包。我认为下一个版本的平台会有文本,所以这会很好我将更改问题标题,以更好地反映我真正关心的问题“哪些Haskell模块有效地提供或支持我需要的序列操作?”谢谢EHRD和其他响应者。 < p>对于这个回答的其余部分,我假设你实际上是在存储原始字节,而不是字符。如果你想存储字符,那么你应该考虑使用Unicode文本的等效代码<代码> ByTeStord。或者在此基础上编写您自己的基于fingertree的结构。您也可以将
ByteString
与软件包中的模块一起使用;我认为这可能会更有效,但对于Unicode文本,它的功能远不如Text
充分
您链接的rope包只存储与ByteString
s等效的数据,而Seq
是通用的,可以处理任何类型的数据;前者可能更有效地存储字节字符串
我怀疑这是相同的基本树结构,因为rope实现了“bytestrings的fingertrees”,而Seq
是一个2-3个finger树;它取决于包,本质上与Data.Sequence相同,但更一般。很可能是rope通过testring将数据打包成shortByteString
s,这是使用Seq
无法实现的(如果不中断length
等操作)
总而言之,如果您存储字节字符串数据,rope似乎是一种更好的结构,它似乎具有“注释”字符串段的奇特功能;然而,它最后一次更新是在7月,新的解析器组合器库是由同一位作者编写的(首次发布于8月)包含其,因此在其基础上创建新代码可能是不明智的。当然,对trifecta所做的更改可能与一般用途无关,并且将这些更改拆分为新版本的rope可能不会太困难;可能它们没有被拆分的唯一原因是因为trifecta已经有大量依赖项:)
但是,如果您在处理过程中的任何时候都需要通用容器类型