gpt4 book ai didi

python - 在 python 中编写一个快速解析器

转载 作者:太空狗 更新时间:2023-10-29 20:44:22 24 4
gpt4 key购买 nike

我已经为我们在一个讲座中使用的某种文件格式 ( ARFF ) 编写了一个动手递归纯 python 解析器。现在运行我的练习提交非常慢。事实证明,大部分时间都花在了我的解析器上。它消耗了大量的 CPU 时间,HD 不是瓶颈。

我想知道用 python 编写解析器有哪些高效的方法?我不想用 C 语言重写它。我尝试使用 jython,但这大大降低了性能!我解析的文件部分很大(> 150 MB),行很长。

我当前的解析器只需要先行查看一个字符。我会在这里发布源代码,但我不知道这是否是个好主意。毕竟提交截止日期还没有结束。但是,这个练习的重点不是解析器。您可以选择要使用的任何语言,并且已经有一个用于 Java 的解析器。

注意:我有一个 x86_64 系统,所以 psyco(它似乎也是 PyPy)不是一个选项。

更新:我现在将我的解析器/编写器上传到 bitbucket .

最佳答案

在没有进一步信息的情况下,我给出的最一般的提示是一次将整个文件或至少其中的大部分读入内存。您不想一次读一个字符并到处寻找;不管引擎盖下发生的缓冲如何,将整个事情都放在内存中可能是个好主意,这样您就可以随心所欲地对其进行操作。

我用 Python 编写了解析器,并没有特别要求它们比用任何其他语言编写的解析器特别慢。与这些事情一样,你更有可能在做你不需要做的工作。在这些元素类别中,创建、销毁和重新创建相同的对象比将其存储在某个地方的成本更高。一遍又一遍地重新计算一个值比将它存储在某个地方的成本更高。等等等等

特别是在 Python 中,人们掉入的一个陷阱是进行大量不必要的字符串操作。不要一次向字符串追加一个字符;当你建立你的 token 时,在“主”字符串上做你的工作并一口气去掉 token 。 (换句话说,对“master”字符串进行索引,找出起点和终点,然后使用 token = master[start:end] 获取它。)一次一个字符地进行字符串连接时间是性能痛苦的捷径。我怀疑即使你出于某种原因想要/需要在 master 中执行 for c: newstr += c 你可能更幸运地将 'c' 填充到列表中然后 newstr = '' .join(newstr_charlist).

关于python - 在 python 中编写一个快速解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2722995/

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