Python 解析后下一步是什么?

Python 解析后下一步是什么?,python,parsing,pyparsing,Python,Parsing,Pyparsing,作为大型纯Python应用程序的一部分,我为pyparsing开发了一个庞大的语法。 我已经达到了性能调整的极限,我正处在收益递减让我开始寻找其他地方的时候。是的,我想我知道大部分的技巧和窍门,我已经把我的语法和我的应用程序写得一尘不染 接下来呢 我希望找到一个解析器,它能给我同样的可读性、可用性(我正在使用pyparsing的许多高级功能,例如parse actions来启动正在解析的输入的后处理)和python集成,但性能要达到10倍 我喜欢语法是纯Python的事实 我所有的基本块都是正则

作为大型纯Python应用程序的一部分,我为pyparsing开发了一个庞大的语法。 我已经达到了性能调整的极限,我正处在收益递减让我开始寻找其他地方的时候。是的,我想我知道大部分的技巧和窍门,我已经把我的语法和我的应用程序写得一尘不染

接下来呢

我希望找到一个解析器,它能给我同样的可读性、可用性(我正在使用pyparsing的许多高级功能,例如parse actions来启动正在解析的输入的后处理)和python集成,但性能要达到10倍

我喜欢语法是纯Python的事实

我所有的基本块都是正则表达式,所以重用它们会很好

我知道我不能拥有一切,所以我愿意放弃一些我今天拥有的功能,以达到要求的10倍性能


我该怎么办?

看来pyparsing的人已经预料到了你的问题。发件人:

对于复杂语法和/或大型输入字符串,
pyparsing
的性能可能会很慢。
psyco
包可用于提高
pyparsing
模块的速度,而不改变语法或程序逻辑-观察到的改进在20-50%的范围内

然而,正如Vangel在下面的评论中指出的那样,
psyco
截至2012年3月是一个过时的项目。它的继任者是这个项目,它从相同的基本性能方法开始:使用JIT本机代码编译器而不是字节码解释器。如果切换Python实现适合您,那么您应该能够使用PyPy获得类似或更大的收益

如果你真的是一个速度恶魔,但想保持一些易读性和声明性语法,我建议看看ANTLR。可能不是Python生成后端;我怀疑这是否足够成熟或高性能以满足您的需求。我说的是商品:启动这一切的C后端

围绕解析器的入口点包装一个PythonC扩展模块,并将其松开


话虽如此,在这个转换过程中您将放弃很多:基本上,您想要在解析器中执行的任何Python都必须通过C API完成(并不完全是漂亮的)。此外,你还必须习惯不同的做事方式。ANTLR有它的魅力,但它不是基于组合词的,所以语法和语言之间没有pyparsing中那种简单而流畅的关系。此外,它还有自己的DSL,很像lex/yacc,可以呈现一条学习曲线——但是,因为它是基于LL的,你可能会发现它更容易适应你的需要。

如果不进行测试,你就无法知道你会得到什么样的好处,但是,如果您的流程是长期运行和重复的,那么仅使用它就有可能获得10倍的好处。(另外,如果您有很多东西需要解析,并且通常会为每一个解释器启动一个新的解释器,那么Unladen Swallow会变得更快—在某种程度上—您运行流程的时间越长,因此,虽然解析一个输入可能不会显示太多收益,但您可能会在同一流程中的第二个和第三个输入上获得显著收益)


(注意:从SVN中提取最新版本-您将获得比最新tarball更好的性能)

切换到生成的C/C++解析器(使用ANTLR、flex/bison等)。如果您可以将所有操作规则延迟到完成解析之后,那么您可能能够使用简单的代码构建AST,然后通过类似SWIG的方式将其传递回python代码,并使用当前操作规则对其进行处理。OTOH,为了提高速度,解析必须是一项繁重的工作。如果你的动作规则花费很大,那么除非你也用C语言编写动作规则,否则这不会给你带来任何好处(但你可能不得不这样做,以避免为python和C代码之间的阻抗不匹配买单)。

如果你真的想要大语法的性能,那就只需要(它本身依赖于mxTextTools,一个C扩展)。但是,现在要知道,它的代价是更加神秘,并且要求您精通


这绝对不是一条更具Python风格的路线,您必须从头开始使用EBNF语法才能使用SimpleParse。

派对晚了一点,但是,这对我很有帮助。PLY为您提供了一个纯Python框架,用于构建基于lex和基于yacc的令牌化程序

当我遇到pyparsing的性能问题时,我就这样做了


这是一篇关于Python解析的老文章,但仍然很有趣,其中包括。在本测试中,PLY的速度大约是pyparsing的4倍。

Nick-我开始阅读关于我们的文章,在安装、编译和构建Pycon2010演示基准时,我遇到了Pycon2010演示基准。我没有看到任何基准比CPython有2倍的增长2.6.4!你为什么期望有更好的结果呢?也就是说,这是最简单的选择,所以我还是试试吧…@Tal:我个人的经验,真的(能够在一些解析代码上获得3.5-4倍的速度提升)。美国基准测试是真实世界的基准测试,这很有用,但它们忽略了重新调整代码以从我们身上获得更多好处的好处-具体来说,就是创建一个长期运行的过程,而不是一堆短期的过程来做你的工作。当我做解析测试时,解析一个文件的差异微乎其微-可能快5-10%-但是,当第10个文件通过相同的解析器处理时,它的运行速度快了近400%。psyco已经死了,不再维护。但是我找到了PyPy并尝试了一下。2013年的答案?是的,我确实研究了cython,但我不知道cython如何与pyton程序一起工作。显然,pypa有现成的东西rsing和cython,但它是python3.0的2.xpyparsing分支,否则我完全搞不懂它