使用python在循环内部进行正则表达式搜索非常慢

时间:2015-06-23 15:10:44

标签: python regex

我发现了一件奇怪的事情

for el in values:
    unit=re.search(regex_unit, el, re.IGNORECASE).group()
    value=re.search(regex_value, el, re.IGNORECASE).group()
    print("Unit: "+unit+" - "+"Value: "+value)

这段代码非常慢但是如果我用这种方式写它就超级快......

for el in values:
    unit=re.search(regex_unit, el, re.IGNORECASE).group()
    print("Unit: "+unit)
for el in values:
    value=re.search(regex_value, el, re.IGNORECASE).group()
    print("Value: "+value)

第一件od代码出了什么问题?

***更新

regex_unit="(kb|mb|gb)"
regex_value="\d"

1 个答案:

答案 0 :(得分:2)

对于正则表达式,一般来说,我建议编译它们。

这个答案当然不能回答速度差异的问题。但我猜想,Python运行时就是这样:

如果必须执行正则表达式,它会编译它并缓存结果。如果它在没有其他正则表达式的循环内运行(如在第二个代码中),则使用缓存版本。但是如果它与其他正则表达式交替,则缓存版本总是被覆盖并且必须再次创建,这会大大降低速度,因为编译步骤必须一次又一次地完成。

您可以通过自己编译来绕过问题,例如:

regex_unit_compiled = re.compile(regex_unit)

之后,在循环中使用它:

unit=regex_unit_compiled.search(el, re.IGNORECASE).group()

如果我的猜测是正确的,那么使用编译的正则表达式你应该会更好。