是否有任何正则表达式引擎可以进行即时编译?

时间:2009-11-20 08:22:38

标签: c++ python c regex jit

我的问题是

是否有正则表达式引擎在正则表达式模式解析期间进行即时编译并在匹配/替换文本时使用?或者我在哪里可以学习JIT for i386或x64架构?

为什么我需要它

我最近trying to benchmark Python’s built-in regex engine与普通C代码相比,大约有10MB数据。

我发现直接替换(例如abzzz)它的速度相对较快:比C慢2到3倍。

但对于[a-z]c,它花费的时间大约是C的5到8倍。

通过分组(例如([a-z])(c)AA\2\1BB),它花费的时间是C的20到40倍。

这不是即时编译,但我认为,如果我可以进行即时编译,它可以加速更多。

PS:我在编译模式时使用每个正则表达式模式的分析, 例如,简介1(如ab的简档1,范围[a-z]c的简档2,分组([a-z])(c)的简档3,每个配置文件都有单独的代码,因此匹配和替换时无需额外费用简单的模式。

更新1

我用psyco尝试过它,它并没有提高速度。 可能是因为我正在对大数据进行文本替换,而不是循环多次。

如果我没有错,那么Python的re.sub本身已经在运行它了,所以pysco无法提高速度。

更新2

我尝试将boost regex包装到python中,但它甚至比Python的正则表达式慢,所以看起来瓶颈在于Python的字符串处理,Jan Goyvaerts也在答案中指出了这一点。

更新

我想将正则表达式模式ab[a-z]c转换为机器代码,如下面的等效C代码(*s指向10MB长文本):

do{
    if(*s=='a' && s[1]=='b' && s[2]>='a' && s[2]<='z' && s[3]=='c') return 1;
}while(*s++);
return 0;

有什么想法吗?

9 个答案:

答案 0 :(得分:5)

PCRE自8.20开始就有一个JIT编译器。你可以在这里阅读:http://sljit.sourceforge.net/pcre.html

答案 1 :(得分:3)

我知道可以将正则表达式编译成可执行代码的唯一正则表达式引擎是.NET中传递RegexOptions.Compiled的引擎。这导致Regex类发出MSIL,然后可以像任何其他.NET代码一样进行JIT。

是否使.NET正则表达式引擎比其他引擎更快是完全不同的事情。在大型数据集上使用相对简单的正则表达式进行搜索和替换时,字符串处理变得更加重要。 .NET字符串是不可变的,这取决于字符串需要重新分配的次数。

手动编码操作总是会更快,因为代码不相同。正则表达式代码维护有关正则表达式匹配和代码不匹配的捕获组的某些信息。在大多数情况下,手动编码搜索和替换而不是使用正则表达式所花费的额外时间是不值得的,特别是如果你考虑到当你的需求改变时切换到不同的正则表达式是微不足道的,同时重写使用过程代码进行搜索和替换需要更多时间。

根据我的经验,PCRE是最快的正则表达式引擎之一。但是,它不包括现成的搜索和替换。

答案 2 :(得分:2)

我不是Python专家,但你可以尝试一下Psycho:

http://www.ibm.com/developerworks/library/l-psyco.html

http://psyco.sourceforge.net/

答案 3 :(得分:2)

因此,如果我理解正确的话,你会使用一种编程语言,默认情况下不会进行即时编译,现在你正在寻找一个能够正确编写的正则表达式库吗?

我认为您应该使用例如将所有python代码编译为二进制文件Psyco的

http://www.devshed.com/c/a/Python/How-Python-Runs-Programs/4/

这里也讨论过:

Is it feasible to compile Python to machine code?

在这里:

Is it possible to compile Python natively (beyond pyc byte code)?

如果这些解决方案不起作用或仍然不够快,如果你绝对想在python中编写你的应用程序的其余部分,那就有boost python c ++库:

http://www.boost.org/doc/libs/1_41_0/libs/python/doc/index.html

boost.python库允许python和c ++之间的完全互操作性。然后,您可以使用boost.regex c ++正则表达式匹配器:

http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/html/index.html

答案 4 :(得分:2)

我在你的问题中没有看到它,所以我问:你是否用预编译的正则表达式测试,例如“re.compile(pattern)”??

由于编译的正则表达式应该更快。好的,它不是JIT,但大部分时间你都可以使用简单的预编译!

见这里:

re.compile

答案 5 :(得分:2)

另一个想法:如果你有一个库(在C中)比Python正则表达式模块更优化或者正确编译正则表达式,那么你可以为python编写自己的正则表达式模块你的C库。

这当然是一些更多的工作,只有当你确实需要速度时才推荐。

您也可以尝试Cython(我个人还没有使用它,但听起来相当不错)来完成包装工作。

尽管我现在理解你的问题,Python周围不是你的问题(所以我怀疑psyco是否会有所帮助) - 同样正在运行的正则表达式的准备不是你的问题,但运行本身必须是顶级的-速度。那当然取决于你使用的库以及处理大字符串的能力。我认为,标准的python regex-lib并没有针对如此长的字符串和最高速度进行优化。

答案 6 :(得分:1)

Firefox中的正则表达式引擎会将一些(不是全部!)正则表达式编译为机器代码。我相信Safari和Chrome也是如此。

答案 7 :(得分:1)

我可能错了,但我相信Python的正则表达式模块在C中,所以编译Python的任何建议(比如使用Psycho)都没有太大区别 - 你实际比较的是一个C的性能regex库(Python)和另一个(你正在使用的库)。

答案 8 :(得分:1)

汤普森在1968年的ACM通讯中发表了一篇论文,描述了一个正常表达式的工作JIT编译器到IBM 7094代码中。我不知道他用的是哪种语言; Fortran或LISP将是明显的嫌疑人,因为它已经有JIT编译,因此LISP特别可疑。