Python re module staje się 20 razy wolniejszy, gdy zapętlasz więcej niż 100 różnych wyrażeń regularnych
Mój problem polega na analizowaniu plików dziennika i usuwaniu części zmiennych w każdej linii, aby je pogrupować. Na przykład:
s = re.sub(r'(?i)User [_0-9A-z]+ is ', r"User .. is ", s)
s = re.sub(r'(?i)Message rejected because : (.*?) \(.+\)', r'Message rejected because : \1 (...)', s)
Mam około 120+ pasujących reguł, takich jak powyżej.
Nie znalazłem żadnych problemów z wydajnością podczas wyszukiwania kolejno po 100 różnych wyrażeń regularnych. Ale ogromne spowolnienie występuje przy stosowaniu 101 wyrażeń regularnych.
Dokładnie to samo dzieje się przy zastępowaniu moich reguł
for a in range(100):
s = re.sub(r'(?i)caught here'+str(a)+':.+', r'( ... )', s)
Zamiast tego korzystał z 20-krotnie wolniejszego zakresu (101).
# range(100)
% ./dashlog.py file.bz2
== Took 2.1 seconds. ==
# range(101)
% ./dashlog.py file.bz2
== Took 47.6 seconds. ==
Dlaczego tak się dzieje? Czy istnieje jakieś znane obejście?
(Dzieje się w Pythonie 2.6.6 / 2.7.2 w systemie Linux / Windows.)