gpt4 book ai didi

Haskell Parsec - 优化 int 解析

转载 作者:行者123 更新时间:2023-12-02 16:43:26 25 4
gpt4 key购买 nike

我正在使用import Text.Parsec.Textimport Text.Parsec.Char解析一些包含整数的数据。我正在使用以下代码来解析整数。

p_int :: Parser Int
p_int = read <$> ((++) <$> option "" (string "-") <*> many1 digit)

我分析了我的程序,发现上面的代码片段占用了超过 90% 的执行时间。如何优化上面的代码?

我遇到了Text.ParserCombinators.Parsec.Number包含 int 的模块解析整数的函数。然而,它的类型是 int :: Integral i => CharParser st iText 不兼容我正在使用的基于解析器,如下面的错误所示。

   • Couldn't match type ‘[Char]’ with ‘Text’
Expected type: Parser Int
Actual type: Text.ParserCombinators.Parsec.Char.CharParser () Int

更新我替换了Text.Parsec.TextText.Parsec.String并将我的 int 解析函数替换为 int来自Text.ParserCombinators.Parsec.Number 。这将执行时间缩短了约 40%。但性能还是比Python差。分析显示,约 80% 的时间消耗在 int 解析上。这是否意味着秒差距只是很慢?

COST CENTRE    MODULE                               SRC                                                       %time %alloc

sign Text.ParserCombinators.Parsec.Number Text/ParserCombinators/Parsec/Number.hs:277:1-73 34.4 39.8
number Text.ParserCombinators.Parsec.Number Text/ParserCombinators/Parsec/Number.hs:(321,1)-(323,18) 26.7 27.5
numberValue Text.ParserCombinators.Parsec.Number Text/ParserCombinators/Parsec/Number.hs:(327,1)-(328,74) 10.2 6.7
zeroNumber Text.ParserCombinators.Parsec.Number Text/ParserCombinators/Parsec/Number.hs:(300,1)-(301,56) 6.0 10.0
...

....

int Text.ParserCombinators.Parsec.Number Text/ParserCombinators/Parsec/Number.hs:273:1-17 499 0 1.4 1.6 79.5 86.5

最佳答案

我用 Attoparsec 替换了 Parsec,在没有任何优化的情况下,它现在速度提高了 80%。此外,“总分配量”从 3GB 以上降至 507MB。

两个库之间的 API 非常相似,因此迁移起来一点也不困难。如果可能的话,我会尝试进一步优化它,看看它能达到多快。

关于Haskell Parsec - 优化 int 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59752788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com