Sto cercando il modo più veloce per sostituire un numero elevato di sottostringhe all'interno di una stringa molto grande. Ecco due esempi che ho usato.Il metodo Python più veloce per la ricerca e la sostituzione su una stringa di grandi dimensioni
findall() è più semplice ed elegante, ma richiede una quantità incredibile di tempo.
finditer() passa attraverso un file di grandi dimensioni, ma non sono sicuro che questo sia il modo giusto per farlo.
Ecco alcuni esempi di codice. Tieni presente che il testo effettivo a cui sono interessato è una singola stringa di circa 10 MB di dimensioni e c'è un'enorme differenza in questi due metodi.
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)
UPDATE Aggiunto metodo re.sub a test:
def sub_replace(reg, rep, text):
output = re.sub(reg, rep, text)
return output
Risultati
re.sub() - 0: 00: 00.031000
finditer() - 0 : 00: 00.109000
findall() - 0: 01: 17.260000
e il secondo è davvero molto più veloce? Sembra strano per me, dovrebbero prendere ca. lo stesso tempo. E penso che entrambi i modi siano corretti. –
perché non stai usando il metodo sub di re? –
L'uso di + = con le stringhe è un'operazione O (n^2), rispetto alla O (n) della costruzione di un elenco e l'utilizzo di "" per unirsi. –