在pyparsing之后的下一步是什么?

时间:2010-07-02 06:34:51

标签: python parsing pyparsing

我为pyparsing开发了一个庞大的语法,作为大型纯Python应用程序的一部分。 我已经达到了性能调整的极限,我正处于收益递减让我开始寻找其他地方的地步。是的,我想我知道大部分提示和技巧,并且我已将我的语法和应用程序描述为灰尘。

下一步是什么?

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

我喜欢语法是纯Python的事实。

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

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

我从哪里开始?

5 个答案:

答案 0 :(得分:6)

看起来像是一个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的,你可能会发现它更容易适应你的需求。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果你真的想要大型语法的性能,那么看起来不要超过SimpleParse(它本身依赖于mxTextTools,一个C扩展)。但是,现在知道它的代价是更加神秘,要求你精通EBNF

这绝对不是更多的Pythonic路线,你将不得不重新开始使用EBNF语法来使用SimpleParse。

答案 3 :(得分:1)

如果不进行测试,就没有办法知道你会得到什么样的好处,但是如果你的过程是长期运行的,那么只要使用Unladen Swallow就可以获得10倍的好处。重复。 (另外,如果你有很多要解析的东西,你通常会为每个解释器启动一个新的解释器,Unladen Swallow变得更快 - 达到一定程度 - 你运行你的进程的时间越长,所以解析一个输入可能没有太大的收益,你可能会在同一过程中获得第二和第三输入的显着增益。)

(注意:从最新的SVN中取出 - 你会获得比最新的tarball更好的性能)

答案 4 :(得分:1)

参加聚会有点晚,但是PLY (Python Lex-Yacc)对我的服务很好。 PLY为您提供了一个纯Python框架,用于构造基于lex的令牌生成器和基于yacc的LR parsers

当我遇到pyparsing的性能问题时,我就选择了这条路线。

这是一篇关于Python解析的旧文章,但仍然很有趣,其中包括benchmarks for ANTLR, PLY and pyparsing。在此测试中,PLY比pyparsing快4倍。