作为一个大型纯Python应用程序的一部分,我为pyparsing开发了一个庞大的语法。我已经达到了性能调整的极限,我已经到了回报递减让我开始寻找其他地方的地步。是的,我想我知道大部分的技巧和技巧,我已经概述了我的语法和我的应用程序。
下一步呢?
我希望找到一个解析器,给我同样的可读性和可用性(我正在使用pyparsing的许多高级功能,如解析操作来启动正在解析的输入的后处理),并集成python,但的性能是10倍。
我喜欢语法是纯Python的这一事实。
我所有的基本块都是正则表达式,所以重用它们会很好。
我知道我不可能拥有一切,所以我愿意放弃我今天所拥有的一些功能,以达到所要求的10倍性能。
从这里我该去哪里?
发布于 2010-07-02 14:54:53
看起来pyparsing的人已经预料到你的问题了。来自https://github.com/pyparsing/pyparsing/blob/master/HowToUsePyparsing.rst:
对于复杂的语法和/或大型输入字符串,pyparsing
的
性能可能会很慢。
psyco
包可用于在不更改语法或程序逻辑的情况下提高pyparsing
模块的速度-观察到的改进在20-50%的范围内。
然而,正如万格尔在下面的评论中指出的那样,截至2012年3月,psyco
是一个过时的项目。它的后继者是PyPy项目,该项目从相同的基本性能方法开始:使用JIT本机代码编译器而不是字节码解释器。如果切换PyPy实现对您有效,那么您应该能够获得类似或更大的收益。
如果你真的很喜欢速度,但又想保留一些易读性和声明性语法,我建议你看看ANTLR。可能不是Python生成后端;我怀疑它是否足够成熟或高性能来满足您的需求。我说的是好东西:开启这一切的C后端。
在解析器的入口点周围包装一个Python C扩展模块,并使其松散。
话虽如此,在这个过渡过程中,您将放弃很多东西:基本上,您想在解析器中执行的任何Python都必须通过C API完成(并不完全美观)。此外,你还必须习惯于完全不同的做事方式。ANTLR有它的魅力,但是它不是基于组合符的,所以你的语法和你的语言之间不存在像pyparsing那样简单和流畅的关系。另外,它有自己的DSL,很像lex/yacc,它可以呈现一个学习曲线-但是,因为它是基于LL的,你可能会发现它更容易适应你的需求。
发布于 2010-07-03 08:15:47
切换到生成的C/C++解析器(使用ANTLR、flex/bison等)。如果你可以延迟所有的动作规则,直到你完成解析之后,你也许能够用简单的代码构建一个AST,然后通过像SWIG这样的东西将它传递回你的python代码,并使用你当前的动作规则对其进行处理。OTOH,为了给你带来速度提升,解析必须是繁重的工作。如果你的动作规则是很大的代价,那么这不会给你带来任何好处,除非你也用C编写你的动作规则(但你可能无论如何都要这样做,以避免为你得到的python和C代码之间的阻抗不匹配买单)。
发布于 2010-07-14 23:44:03
如果您真的想要大型语法的性能,只需看看SimpleParse (它本身依赖于mxTextTools,一个C扩展)。然而,现在要知道,它的代价是变得更加隐秘,并要求您精通EBNF。
这绝对不是Pythonic式的路线,您必须从头开始使用EBNF语法才能使用SimpleParse。
https://stackoverflow.com/questions/3163688
复制相似问题