re (RegEx) Performance: Ist re.compile() schneller?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Sonntag 4. März 2007, 11:23

Ich durchwandere eine Datei zeilenweise und prüfe jede Zeile mit einem RegEx. Ich frage mich gerade, ob es schneller geht, wenn man einmal am Anfang die benötigten RegEx-Pattern erzeugt:

Code: Alles auswählen

spam = re.compile("^spam$")
eggs = re.compile("^eggs$")
und dann in der Schleife mit diesen "vor-compilierten" Pattern arbeitet:

Code: Alles auswählen

for line in lines:
    if spam.search(line):
        #it's a spam line!
        pass
    elif eggs.search(line):
        # it's an eggs line!
        pass
    else:
        # ignore this line
Oder macht es keinen Unterschied zu dem hier:

Code: Alles auswählen

for line in lines:
    if re.search("^spam$", line):
        #it's a spam line!
        pass
    elif re.search("^eggs$", line):
        # it's an eggs line!
        pass
    else:
        # ignore this line
Man muss auch Dateien mit einigen zehntausend Zeilen berücksichtigen. Ich denke, dass ein `re.search(pattern, line)` jedesmal wieder intern ein `re.compile(pattern)` auslöst. Bei nur wenigen Suchmustern wäre es Blödsinn, diese jedesmal neu zu compilieren, oder?
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Sonntag 4. März 2007, 11:42

droptix hat geschrieben:Ich frage mich gerade, ob es schneller geht, wenn man einmal am Anfang die benötigten RegEx-Pattern erzeugt
Ja :D

Außerdem wird der Code ein ganzes Stückchen übersichtlicher, da man in den wichten Code-Abschnitten relativ kurze und eindeutige Ausdrücke hat.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 4. März 2007, 12:34

Ja, deine Vemutung war richtig - es steht auch so in der Dokumentation drin (zwar mit ``match`` statt ``search`` aber das ist analog übertragbar):
Python Dokumentation zu re.compile hat geschrieben:The sequence

prog = re.compile(pat)
result = prog.match(str)

is equivalent to

result = re.match(pat, str)

but the version using compile() is more efficient when the expression will be used several times in a single program.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten