Poszukuję najszybszego sposobu na zastąpienie dużej liczby pod-ciągów wewnątrz bardzo dużego ciągu. Oto dwa przykłady, których użyłem.Najszybsza metoda Pythona do wyszukiwania i zamiany na dużym łańcuchu
findall() Czuje się prostsze i bardziej eleganckie, ale zajmuje zdumiewającą ilość czasu.
finditer() lśni przez duży plik, ale nie jestem pewien, czy to właściwy sposób.
Oto przykładowy kod. Zwróć uwagę, że tekst, który mnie interesuje, jest pojedynczym łańcuchem o rozmiarze około 10 MB i istnieje ogromna różnica w tych dwóch metodach.
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 Dodano re.sub metody badań:
def sub_replace(reg, rep, text):
output = re.sub(reg, rep, text)
return output
Wyniki
re.sub() - 0: 00: 00,031000
finditer() - 0 : 00: 00.109000
findall() - 0: 01: 17.260000
a drugi jest naprawdę dużo szybciej? Wydaje mi się dziwne, powinny one zająć około. o tym samym czasie. I myślę, że obie drogi są poprawne. –
dlaczego nie używasz metody re's sub? –
Używanie + = z ciągami jest operacją O (n^2), w porównaniu do O (n) budowania listy i używania "" do łączenia. –