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

问题描述 投票:20回答:5

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

接下来是什么?

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

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

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

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

我从哪里开始?

python parsing pyparsing
5个回答
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的,你可能会发现它更容易适应你的需求。


2
投票

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


2
投票

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

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


1
投票

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

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


1
投票

派对有点晚了,但是PLY (Python Lex-Yacc),对我很有帮助。 PLY为您提供了一个纯Python框架,用于构建基于lex的标记化器,以及基于yacc的LR parsers

当我遇到pyparsing的性能问题时,我走了这条路。

这是一篇有点古老但仍然很有趣的Python解析文章,其中包括benchmarks for ANTLR, PLY and pyparsing。在该测试中,PLY比pyparsing快大约4倍。

© www.soinside.com 2019 - 2024. All rights reserved.