Tal*_*iss 20 python parsing pyparsing
作为大型纯Python应用程序的一部分,我为pyparsing开发了一个巨大的语法.我已经达到了性能调整的极限,我正处于收益递减让我开始寻找其他地方的地步.是的,我想我知道大部分提示和技巧,并且我已经将我的语法和应用程序描述为灰尘.
接下来是什么?
我希望找到一个解析器,它给我相同的可读性,可用性(我使用许多高级的pyparsing功能,如parse-actions来启动正在解析的输入的后处理)和python集成但是在10×表现.
我喜欢语法是纯Python的事实.
我所有的基本块都是正则表达式,所以重用它们会很好.
我知道我不能拥有所有东西所以我愿意放弃今天的一些功能来达到要求的10倍性能.
我从哪里开始?
看起来似乎是pyparsing的人已经预料到了你的问题.来自https://github.com/pyparsing/pyparsing/blob/master/HowToUsePyparsing.rst:
pyparsing对于复杂的语法和/或大的输入字符串,性能可能很慢.该psyco软件包可用于提高pyparsing模块的速度,而无需更改语法或程序逻辑 - 观察到的改进已达到20-50%的范围.
但是,正如Vangel在下面的评论中指出的psyco那样,截至2012年3月是一个过时的项目.它的继任者是PyPy项目,它从相同的基本性能方法开始:使用JIT本机代码编译器而不是字节码解释器.如果切换Python实现对您有用,您应该能够使用PyPy获得类似或更大的收益.
如果你真的是速度恶魔,但想要保留一些易读性和声明性语法,我建议你看一下ANTLR.可能不是Python生成的后端; 我怀疑这种成熟或高性能是否足以满足您的需求.我在谈论货物:C后端开始了这一切.
围绕解析器的入口点包装Python C扩展模块,并将其松散.
话虽如此,你将在这个过渡中放弃很多:基本上你想要在你的解析器中做的任何Python都必须通过C API完成(并不完全相当).此外,你必须习惯于非常不同的做事方式.ANTLR有它的魅力,但它不是基于组合器,所以你的语法和语言之间没有简单和流畅的关系,就像pyparsing一样.另外,它是自己的DSL,很像lex/yacc,它可以呈现学习曲线 - 但是,因为它是基于LL的,你可能会发现它更容易适应你的需求.