我希望有人能帮我解释为什么Python的re模块在为我切碎一个非常大的字符串时显得如此缓慢。你知道吗
我有一个字符串(“content”),大小接近60万字节。我只想砍掉它的开头部分,一个可变的行数,由文本“>;>;FOOBAR<;<;”分隔。你知道吗
文字完成时间是为比较目的而提供的—此代码段所在的脚本需要一点时间才能自然运行。你知道吗
第一种也是最坏的方法:
import re
content = "Massive string that is 600k and contains >>>FOOBAR<<< about 200 lines in"
content = re.sub(".*>>>FOOBAR<<<", ">>>FOOBAR<<<", content, flags=re.S)
完成时间:
real 6m7.213s
而一个冗长的方法:
content = "Massive string that is 600k and contains >>>FOOBAR<<< about 200 lines in"
newstir = ""
flag = False
for l in content.split('\n'):
if re.search(">>>FOOBAR<<<", l):
flag = True
#End if we encountered our flag line
if flag:
newstir += l
#End loop through content
content = newstir
预计完成时间:
real 1m5.898s
并使用string的.split方法:
content = "Massive string that is 600k and contains >>>FOOBAR<<< about 200 lines in"
content = content.split(">>>FOOBAR<<<")[1]
预计完成时间:
real 1m6.427s
这是怎么回事?为什么我的回复sub对同一根弦这么不虔诚地慢叫?你知道吗
对于以
.*
或.*?
开始的模式,尤其是对于大数据,没有好的方法可以做到这一点,因为第一种模式将导致大量回溯,而第二种模式必须在以下子模式失败(直到成功)的情况下测试每个执行的字符。使用非贪婪量词并不比使用贪婪量词快。你知道吗我怀疑您的~600k内容数据在一开始就在一个文件中。不是加载整个文件并将其内容存储到变量中,而是逐行工作。这样可以保留内存,避免拆分和创建行列表。第二件事,如果您要查找文本字符串,请不要使用regex方法,而是使用一个简单的字符串方法,如
find
,它更快:如果
>>>FOOBAR<<<
不是一个简单的文本字符串,而是一个regex模式,在本例中,请先编译该模式:相关问题 更多 >
编程相关推荐