Estoy buscando la manera más rápida de reemplazar una gran cantidad de cadenas secundarias dentro de una cadena muy grande. Aquí hay dos ejemplos que he usado.Método más rápido de Python para buscar y reemplazar en una cadena grande
findall() se siente más simple y más elegante, pero lleva una cantidad de tiempo asombrosa.
finditer() se abre a través de un archivo grande, pero no estoy seguro de que este sea el camino correcto para hacerlo.
Aquí hay un código de muestra. Tenga en cuenta que el texto real que me interesa es una cadena única de alrededor de 10 MB de tamaño, y hay una gran diferencia en estos dos métodos.
import re
def findall_replace(text, reg, rep):
for match in reg.findall(text):
output = text.replace(match, rep)
return output
def finditer_replace(text, reg, rep):
cursor_pos = 0
output = ''
for match in reg.finditer(text):
output += "".join([text[cursor_pos:match.start(1)], rep])
cursor_pos = match.end(1)
output += "".join([text[cursor_pos:]])
return output
reg = re.compile(r'(dog)')
rep = 'cat'
text = 'dog cat dog cat dog cat'
finditer_replace(text, reg, rep)
findall_replace(text, reg, rep)
ACTUALIZACIÓN método Agregado re.sub a pruebas:
def sub_replace(reg, rep, text):
output = re.sub(reg, rep, text)
return output
Resultados
re.sub() - 0: 00: 00,031000
finditer() - 0 : 00: 00.109000
findall() - 0: 01: 17.260000
y el segundo uno es realmente mucho más rápido? Me parece extraño, deberían tomar aprox. al mismo tiempo. Y creo que ambas formas son correctas. –
¿por qué no usas el submétodo de re? –
Usar + = con cadenas es una operación O (n^2), en comparación con O (n) de compilar una lista y usar "" para unir. –