使用Python中的re.search时执行时间增加

1 投票
1 回答
705 浏览
提问于 2025-04-17 19:31

我正在处理一个500MB的文件。当我使用re.search时,处理时间变得更长了。

下面是我测试的几个情况。在所有情况下,我都是逐行读取文件,并且只使用了一个if条件。

情况1:

prnt = re.compile(r"(?i)<spanlevel level='7'>")
if prnt.search(line):
print "Matched"
out_file.write(line)
else:
out_file.write(line) 

读取整个文件花了16秒。

情况2:

if re.search(r"(?i)<spanlevel level='7'>",line):
print "Matched"
out_file.write(line)
else:
out_file.write(line)

读取这个文件花了25秒。

情况3:

if "<spanlevel level='7'>" in line:
print "Matched"
out_file.write(line)
else:
out_file.write(line)

读取这个文件只花了8秒。

有没有人能告诉我这三种情况之间的区别?情况3处理得非常快,但我无法进行不区分大小写的匹配。请问在情况3中如何进行不区分大小写的匹配呢?

1 个回答

4

首先进行不区分大小写的搜索:

if "<spanlevel level='7'>" in line.lower():

通过将 line 转换为小写,你就实现了小写的搜索。

至于为什么第二种情况会慢得多:使用预编译的正则表达式会更快,因为这样你就可以避免对每一行读取文件时都去查找正则表达式模式的缓存。实际上,re.search() 如果没有找到缓存的副本,还会调用 re.compile(),这个额外的函数调用和缓存检查会消耗时间。

在 Python 3.3 中,这种情况更糟,因为它切换到了一个新的缓存模型,使用了 functools.lru_cache 装饰器,这个新模型实际上比之前的实现还要慢。有关更多信息,请查看 为什么未编译的、重复使用的正则表达式在 Python 3 中会慢得多?

对于精确文本匹配,使用 in 进行简单文本搜索会更快。正则表达式适合复杂匹配,而你只是想找一个不区分大小写的精确匹配。

撰写回答