【发布时间】:2010-12-18 15:33:45
【问题描述】:
我的问题是
是否有任何正则表达式引擎在正则表达式模式解析期间进行即时编译并在匹配/替换文本时使用?或者我在哪里可以学习 i386 或 x64 架构的 JIT?
为什么我需要它
我最近trying to benchmark Python’s built-in regex engine 与大约 10MB 数据的普通 C 代码相比。
我发现对于直接替换(例如 ab 到 zzz),它相对较快:仅比 C 慢 2 到 3 倍。
但是对于[a-z]c,它花费的时间大约是 C 的 5 到 8 倍。
并且使用分组(例如 ([a-z])(c) 到 AA\2\1BB )花费的时间是 C 的 20 到 40 倍。
它还不是即时编译,但我认为,如果我可以进行即时编译,它的速度会更快。
PS:我在编译模式期间对每个正则表达式模式使用分析,
例如,配置文件 1 用于简单的 ab,配置文件 2 用于范围 [a-z]c,配置文件 3 具有分组 ([a-z])(c),每个配置文件都有单独的代码,因此在匹配和替换简单模式时不需要额外的成本。
更新 1
我已经用 psyco 试过了,它并没有提高速度。 可能是因为我正在对大数据进行文本替换,而不是循环多次。
如果我没记错的话,我认为 Python 的 re.sub 已经在原生运行它,所以 pysco 无法提高速度。
更新 2
我尝试过将 boost 正则表达式封装到 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;
有什么想法吗?
【问题讨论】:
-
只是一个想法。如果你使用 Boost.Regex 你会得到什么结果?
-
好的,我很快就会用 Boost 进行测试。谢谢
-
eh... 我相信那篇文章是说正则表达式的流行实现具有算法效率低下。编译它们可能会以恒定的因素改善事情,但它不会解决根本问题。
-
@Mark:不要评论你自己的问题。请使用 cmets 中的所有其他答案更新您的问题。你拥有这个问题。你可以澄清一下。请澄清问题并使 cmets 无关紧要。
-
我通过近距离投票审核队列得到了这个问题。这已被标记为 off-topic,原因是库和软件建议在此站点上与主题无关。但是,对该原因的描述也建议“描述问题以及迄今为止为解决该问题所做的工作”。这已经完成了。这个问题并不完全归结为软件推荐请求。保持打开状态。