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.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

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

Beitragvon droptix » 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: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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

Beitragvon EyDu » 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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder