用python编写快速解析器

2024-06-17 07:49:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我为我们在一堂课中使用的某种文件格式(ARFF)编写了一个实用的递归纯python解析器。现在运行我的练习提交非常慢。到目前为止,大部分时间都花在我的解析器上。它消耗了大量的CPU时间,HD并不是瓶颈。

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

我当前的解析器只需要在一个字符之前进行一次查找。我会把消息发布在这里,但我不知道这是不是个好主意。毕竟提交截止日期还没有结束。但是,这个练习的重点不是解析器。您可以选择想要使用的任何语言,而且已经有了一个Java解析器。

注意:我有一个x86_64系统,所以psyco(看起来也是PyPy)是没有选择的。

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


Tags: 文件方法gt解析器arff时间mbjython
2条回答

在没有进一步信息的情况下,我给出的最一般的提示是一次将整个文件,或者至少其中的一个重要部分读入内存。你不想一次只读一个字符,到处寻找;不管引擎盖下正在进行的缓冲,最好把整个东西都记下来,这样你就可以随心所欲地操作它。

我已经用Python编写了解析器,没有特别要求它们比用任何其他语言编写的解析器都要慢。因为这类事情,你很可能在做你不需要做的工作。在这类物品中,创建、销毁和重新创建同一个物品要比将其存放在某处花费更多。一次又一次地重新计算一个值比仅仅把它存储在某个地方要昂贵得多。等等

特别是在Python中,人们陷入的一个陷阱是做大量不必要的字符串操作。不要一次给字符串附加一个字符;当您构建令牌时,对“master”字符串执行您的工作,并一举删除令牌。(换句话说,索引到“master”字符串中,找出起始点和结束点,然后用token = master[start:end]获取它。)一次将一个字符串接在一起是导致性能下降的捷径。我想即使你想/需要做for c in master: newstr += c你可能会有更好的运气把'c'塞进一个列表,然后newstr = ''.join(newstr_charlist)

您可以使用ANTLRpyparsing,它们可能会加快您的解析过程。

如果您想保留当前代码,您可能需要查看Cython/PyPy,这会提高性能(有时高达4倍)。

相关问题 更多 >