Python中正则表达式字符串损坏效率慢的解释?

2024-05-29 06:05:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望有人能帮我解释为什么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对同一根弦这么不虔诚地慢叫?你知道吗


Tags: and方法inrestringthatis时间
1条回答
网友
1楼 · 发布于 2024-05-29 06:05:30

对于以.*.*?开始的模式,尤其是对于大数据,没有好的方法可以做到这一点,因为第一种模式将导致大量回溯,而第二种模式必须在以下子模式失败(直到成功)的情况下测试每个执行的字符。使用非贪婪量词并不比使用贪婪量词快。你知道吗

我怀疑您的~600k内容数据在一开始就在一个文件中。不是加载整个文件并将其内容存储到变量中,而是逐行工作。这样可以保留内存,避免拆分和创建行列表。第二件事,如果您要查找文本字符串,请不要使用regex方法,而是使用一个简单的字符串方法,如find,它更快:

with open('yourfile') as fh:
    for line in fh:
        result += line
        if line.find('>>>FOOBAR<<<') > -1:
            break

如果>>>FOOBAR<<<不是一个简单的文本字符串,而是一个regex模式,在本例中,请先编译该模式:

pat = re.compile(r'>>>[A-Z]+<<<')

with open('yourfile') as fh:
    for line in fh:
        result += line
        if pat.search(line):
            break

相关问题 更多 >

    热门问题