首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >pyparsing之后的下一步是什么?

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

Stack Overflow用户
提问于 2010-07-02 14:34:51
回答 5查看 4.3K关注 0票数 22

作为一个大型纯Python应用程序的一部分,我为pyparsing开发了一个庞大的语法。我已经达到了性能调整的极限,我已经到了回报递减让我开始寻找其他地方的地步。是的,我想我知道大部分的技巧和技巧,我已经概述了我的语法和我的应用程序。

下一步呢?

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

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

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

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

从这里我该去哪里?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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的,你可能会发现它更容易适应你的需求。

票数 8
EN

Stack Overflow用户

发布于 2010-07-03 08:15:47

切换到生成的C/C++解析器(使用ANTLR、flex/bison等)。如果你可以延迟所有的动作规则,直到你完成解析之后,你也许能够用简单的代码构建一个AST,然后通过像SWIG这样的东西将它传递回你的python代码,并使用你当前的动作规则对其进行处理。OTOH,为了给你带来速度提升,解析必须是繁重的工作。如果你的动作规则是很大的代价,那么这不会给你带来任何好处,除非你也用C编写你的动作规则(但你可能无论如何都要这样做,以避免为你得到的python和C代码之间的阻抗不匹配买单)。

票数 2
EN

Stack Overflow用户

发布于 2010-07-14 23:44:03

如果您真的想要大型语法的性能,只需看看SimpleParse (它本身依赖于mxTextTools,一个C扩展)。然而,现在要知道,它的代价是变得更加隐秘,并要求您精通EBNF

这绝对不是Pythonic式的路线,您必须从头开始使用EBNF语法才能使用SimpleParse。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3163688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档