pyparsing之后的下一步是什么?

2024-04-25 10:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一个大型纯Python应用程序的一部分,我为pyparsing开发了一个庞大的语法。 我已经达到了性能调整的极限,我正处在收益递减的阶段,这让我开始寻找其他地方。是的,我想我知道大部分的技巧和技巧,我已经把我的语法和我的应用程序简介到dust上了。在

下一步呢?在

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

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

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

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

从这里我要去哪里?在


Tags: actions应用程序解析器技巧parse地方语法特性
3条回答

看起来pyparsing人员已经预料到了您的问题。来自https://github.com/pyparsing/pyparsing/blob/master/HowToUsePyparsing.rst

Performance of pyparsing may be slow for complex grammars and/or large input strings. The psyco package can be used to improve the speed of the pyparsing module with no changes to grammar or program logic - observed improvments have been in the 20-50% range.

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

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

将pythoncextensionmodule包装在解析器的入口点周围,并将其打开。在

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

切换到生成的C/C++解析器(使用ANTLR、Flex、BISON等)。如果您可以延迟所有操作规则,直到您完成解析之后,您就可以用一些简单的代码构建一个AST,然后通过类似SWIG的方法将其传递回python代码,然后使用当前的操作规则对其进行处理。奥托,要想让你提速,解析必须是一项繁重的工作。如果您的操作规则是一个巨大的成本,那么除非您也用C编写您的操作规则,否则这将一无所获(但是您可能不得不这样做,以避免为python和C代码之间的阻抗不匹配付出代价)。在

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

这绝对不是更像python的路径,要使用SimpleParse,您必须从头开始使用EBNF语法。在

相关问题 更多 >