1

我正在处理一个 500MB 的文件。使用研究时处理时间增加。

请找到我测试过的以下案例。在所有情况下,我都在逐行读取文件并且只使用一个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 秒。

有没有人能告诉我这三种情况的区别。Case3 的处理速度非常快,但我无法进行不区分大小写的匹配。如何在 Case3 中进行不区分大小写的匹配?

4

1 回答 1

4

首先搜索 case 3 不区分大小写:

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

通过 lowercasing line,您可以进行小写搜索。

至于为什么情况 2 慢得多:使用预编译的正则表达式会更快,因为这样您就可以避免从文件中读取的每一行的正则表达式模式的缓存查找。在引擎盖下,如果没有缓存副本已经存在并且额外的函数调用和缓存检查会花费你,re.search()也会调用。re.compile()

functools.lru_cache这对 Python 3.3 来说是双重痛苦的,它使用装饰器切换到新的缓存模型,实际上比以前的实现要慢。请参阅为什么在 Python 3 中未编译、重复使用的正则表达式要慢得多?

A simple text search with in is faster for exact text matches. Regular expressions are great for complex matching, you are simply looking for an exact match, albeit case insensitive.

于 2013-03-18T16:26:10.413 回答