Seite 1 von 1

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

Verfasst: Sonntag 4. März 2007, 11:23
von droptix
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?

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

Verfasst: Sonntag 4. März 2007, 11:42
von EyDu
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.

Verfasst: Sonntag 4. März 2007, 12:34
von Leonidas
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.