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

pan*_*nzi 8 python parsing arff

我已经为一个讲座中的一些文件格式(ARFF)编写了一个动手的递归纯python解析器.现在运行我的运动提交非常缓慢.到目前为止,我的解析器花费的时间最多.它消耗了大量的CPU时间,HD不是瓶颈.

我想知道在python中编写解析器的高效方法是什么?我宁愿不用C重写它.我试图使用jython,但这会降低性能!我解析的文件部分很大(> 150 MB),行很长.

我当前的解析器只需要预览一个字符.我会在这里发布消息来源,但我不知道这是不是一个好主意.在所有提交截止日期尚未结束之后.但是,本练习的重点不是解析器.您可以选择要使用的任何语言,并且已经有一个Java解析器.

注意:我有一个x86_64系统,所以psyco(似乎也是PyPy)是没有选择的.

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

wvd*_*wvd 8

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

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

  • pyparsing 不太可能加快速度,但可能会揭示瓶颈所在。另外,我相信已经编写了一个 ARFF pyparsing 解析器,并且在某个地方。 (2认同)

das*_*ang 7

我没有提供进一步信息的最常见提示是将整个文件或至少其中的大部分文件一次性读入内存.你不想一次读一个角色并在这里和那里寻求; 无论在引擎盖下发生什么缓冲,只要将整个内容放在内存中就可以了,这样你就可以按照自己的意愿操作它.

我已经用Python编写了解析器,并且没有特别要求它们比用任何其他语言编写的解析器慢得多.正如这些事情一样,你更有可能做你不需要做的工作.在那些类的项目中,创建和销毁并重新创建同一个对象比将它存储在某个地方更昂贵.一遍又一遍地重新计算一个值比将它存储在某个地方更昂贵.等等

特别是在Python中,人们陷入的一个陷阱是进行大量不必要的字符串操作.不要一次追加一个字符串; 当你构建你的令牌时,你要对"主"字符串进行工作,并一举剥离令牌.(换句话说,索引到"主"字符串,找出起点和终点,然后抓住它token = master[start:end].)一次执行字符串连接一个字符是性能痛苦的短路径.我怀疑,即使你想要/需要某种原因,for c in master: newstr += c你可能会把'c'塞进一个列表然后更好运气newstr = ''.join(newstr_charlist).

  • 现代计算机具有512M或更多的内存.读150MB是没有的.:) (2认同)