Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中加速re.sub_Python - Fatal编程技术网

在python中加速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(mod

我有以下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

干杯

如果受影响的行很少,您可以使用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+=行导致大量内存被复制。

您可以使用re.compile预编译模式,并将编译后的模式传递给re.sub。首先编译正则表达式,查看iterfile中的行让我觉得您可能根本不需要正则表达式,您认为iter在做什么?嗨,我想知道如何在我的职能范围内做到这一点?有什么想法吗?我对所有这些都不熟悉…显示一些内容以及您试图使用它做什么请仔细检查您的问题:函数定义中有参数amode0和amode1,但在第一行中有mode0和mode1。