在python中加速re.sub

时间:2016-02-06 11:33:18

标签: python

我有以下Python代码,但它在10mb文件上运行有点慢。我想知道有什么方法可以加快速度吗?也许通过一次性完成re.sub(而不是两次操作) - 不知道如何做到这一点,或者可能还有另一种方式?

def ChangeMode(file, amode0, amode1, bmode0, bmode1):
for line in iter(file):
    if 'AAA' in line or 'BBB' in line or 'CCC' in line:
            line = re.sub(mode0, mode1, line)
            line = re.sub(bmode0, bmode1, line)
    endstring += line
return endstring

干杯

1 个答案:

答案 0 :(得分:1)

如果受影响的行很少见,可以使用re.subre.finditer直接查找这些行而不是迭代Python级别的行,从而加快速度。如果是简单的字符串替换,str.replace速度很快:

def fsub(m):
    return m.group().replace('ij', 'xx').replace('kl', 'yy')

s = re.sub('(?m)^.*(?:AAA|BBB|CCC).*', fsub, open(path).read())

注意:(?m)会导致^与每行的开头匹配,而.*则不会超越行尾。

REGEX预编译可以加速许多单独的REGEX re.sub(当简单的字符串替换不适用时):

rec = re.compile(r'ij\d+') # once
...
line = rec.sub('xx', line)  # often

re.sub然而已经使用了一个非常快的REGEX编译缓存。)

如果替换不改变字符串大小,您可以使用bytearray / buffers甚至mmap来大大加快速度,并就地修改数据。 (re.sub()string.replace以及endstring += line导致大量内存被复制。)