Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C/Java中处理正则表达式的速度比Python快多少? 我正在寻找比较Python和静态类型语言(如C++、java或C++)之间正则表达式速度的基准。我还想听听Cython对正则表达式的性能。_Python_C_Regex_Performance_Cython - Fatal编程技术网

C/Java中处理正则表达式的速度比Python快多少? 我正在寻找比较Python和静态类型语言(如C++、java或C++)之间正则表达式速度的基准。我还想听听Cython对正则表达式的性能。

C/Java中处理正则表达式的速度比Python快多少? 我正在寻找比较Python和静态类型语言(如C++、java或C++)之间正则表达式速度的基准。我还想听听Cython对正则表达式的性能。,python,c,regex,performance,cython,Python,C,Regex,Performance,Cython,这可能更多地取决于单个实现,而不是语言 例如,一些模式在某些实现中是O(N2),而在其他实现中是~O(N)。具体来说,大多数重新实现都基于NFAs(非确定性有限状态自动机)。长话短说,这意味着,在某些情况下,他们可以并且将以某种模式回溯。这给出了大约O(N2)的复杂性。匹配相同模式的确定性有限状态自动机(DFA)永远不会回溯——它总是具有线性复杂性。同时,DFA的编译阶段通常比NFA更复杂(DFA不具备NFA的所有功能) 因此,对于许多不涉及任何回溯的简单模式,基于NFA的RE引擎可能很容易比基

这可能更多地取决于单个实现,而不是语言

例如,一些模式在某些实现中是O(N2),而在其他实现中是~O(N)。具体来说,大多数重新实现都基于NFAs(非确定性有限状态自动机)。长话短说,这意味着,在某些情况下,他们可以并且将以某种模式回溯。这给出了大约O(N2)的复杂性。匹配相同模式的确定性有限状态自动机(DFA)永远不会回溯——它总是具有线性复杂性。同时,DFA的编译阶段通常比NFA更复杂(DFA不具备NFA的所有功能)

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


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

CPython的正则表达式引擎是用C编写的。另外,为什么您希望静态类型与正则表达式引擎有任何关系?正则表达式只处理字节流或字符流。Cython的性能将与CPython中的纯Python代码大致相同,因为它只是从
\u re
模块中调用相同的C编写函数。@abarnert谢谢通知我。我的假设是错误的。这通常是将C与C进行比较,这更像是一个库问题,因为任何语言中的大多数快速正则表达式函数都是在C/C++等语言中本机实现的,以提高速度。正则表达式特别适合于本机实现,因为紧密且性能关键的循环逻辑被很好地隐藏了起来。有些模式在第一种实现中是O(2^N),而在第二种实现中是失败的。:)@abarnert:但是(至少如果内存可用的话)这些模式在技术上不是正则表达式。当然,但我敢打赌OP(像大多数目前还没有读研究生的人一样…)在他说“正则表达式”时真的意味着“perl风格的正则表达式”。IIRC,即使是Google的RE2实现也不能被定义为一种常规语言。@abarnert:好的,这很公平。@JeffM:也许你可以发布有问题的正则表达式,但一个直接的猜测是,仅仅在C中使用正则表达式不会有多大区别。如果你想要一个明显的不同,你需要做一些不同的事情(例如,使用一个基于DFA的重新引擎,或者在没有实际正则表达式的情况下进行搜索)。