在C / Java中处理的正则表达式比在Python中快多少?

时间:2015-05-08 02:19:18

标签: python c regex performance cython

我正在寻找比较python和静态类型语言(如C,Java或C ++)之间正则表达式速度的基准测试。我还想听听正则表达式的Cython性能。

1 个答案:

答案 0 :(得分:6)

这可能更多地取决于个人实施而不是语言。

例如,有些模式是O(N 2 ),有些实现,但是〜O(N)和其他模式。具体而言,大多数RE实现基于NFA(非确定性有限状态自动机)。总而言之,这意味着他们可以并且在某些情况下会以一些模式回溯。这大致给出了O(N 2 )的复杂性。匹配相同模式的确定性有限状态自动机(DFA)永远不会回溯 - 它总是具有线性复杂性。同时,DFA的编译阶段通常比NFA更复杂(而且DFA没有NFA的所有功能)。

因此,对于许多不涉及任何方式回溯的简单模式,基于NFA的RE引擎可以比基于DFA的引擎更容易运行。但是,当基于NFA的RE引擎试图匹配模式而不是涉及回溯时,它可以(并且将会)大幅减速。在后一种情况下,基于DFA的引擎可能会快很多倍。

大多数RE库基本上都是以表示为字符串的正则表达式开头的。当您执行基于RE的搜索/匹配时,大多数会将其编译为NFA / DFA的数据结构。编译步骤需要一些时间(不是很大,但可能变得很重要,特别是如果你正在使用许多不同的RE)。一些RE引擎(例如,Boost XPressive)可以静态编译正则表达式 - 也就是说,RE与程序的源代码同时编译。这可以消除从程序的执行时间编译RE的时间,因此如果您的代码花费大量时间来编译RE,那么它可以从中获得实质性的改进(但这与静态类型无关 - 至少据我所知,你不可能在Java或C或示例中获得相同的结果)。其他一些语言(例如D)提供了足够的功能,你几乎可以肯定地对它们做同样的事情,但是我不知道你现在可以计划使用它们的实际实现。