在python中加速re.sub
我有以下Python代码,但在10mb文件上运行有点慢。我想知道有没有办法加快速度?可能通过一次完成re.sub(而不是两次操作)-不知道如何完成,或者可能有其他方法在python中加速re.sub,python,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,
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
干杯如果受影响的行很少,您可以使用
re.sub
或re.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)
使^
与每行的开头匹配,并且*
不会超出行尾
正则表达式预编译可以将许多单独的正则表达式re.sub(当简单的字符串替换不适用时)稍微加快一点:
rec = re.compile(r'ij\d+') # once
...
line = rec.sub('xx', line) # often
(re.sub
但是已经使用了一个非常快的正则表达式编译缓存。)
如果替换不改变字符串大小,您可以通过使用
bytearray
/buffers甚至mmap
并就地修改数据来大大加快速度。(re.sub()
和string.replace
和endstring+=line
导致大量内存被复制。)您可以使用re.compile
预编译模式,并将编译后的模式传递给re.sub
。首先编译正则表达式,查看iter(文件)中的行
让我觉得您可能根本不需要正则表达式,您认为iter在做什么?您好,我想知道如何在我的函数上下文中做到这一点?有什么想法吗?我对所有这些都不熟悉…显示一些内容以及您试图用它做什么请仔细检查您的问题:函数定义中有参数amode0
和amode1
,但是在第一行re.sub
中有mode0
和mode1
。