Leistung von re.sub und .replace

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
KoenigGunther
User
Beiträge: 22
Registriert: Donnerstag 19. April 2007, 10:05

Hi!
Welche Variante ist eigentlich schneller?
re.sub('ersetzen','ersetzt',text)
oder
text.replace('ersetzen','ersetzt')?
Oder wird das intern eh wie das gleiche behandelt?
Oder ist re.sub langsamer da der Regex erst noch kompiliert werden muss?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wenn ich einfach nur ein Wort durch ein anderes ersetzen müsste wurde ich die Variante über "replace" bervorzugen, da sich das einfach schneller schreiben lässt. Unter Umständen braucht man jedoch als Ersetzungsmuster einen Regulären Ausdruck, dann kommt man um "re.sub" nicht drum herum. Geschwindigkeiten kannst du mit dem Modul "timeit" testen, hier noch ein kurzes Beispiel für den angesprochenen Fall:

Code: Alles auswählen

import timeit
import re

STRING = "einszweidreivierfuenfsechssiebenachtneunzehn"
REPLACEMENT = "7"
PATTERN = "sieben"
TEST_RE = re.compile(PATTERN)
COUNT = 10000

def replace():
    TEST_STRING.replace(PATTERN, REPLACEMENT)

def regular():
    re.sub(TEST_RE, REPLACEMENT, TEST_STRING)


if __name__ == "__main__":
    global TEST_STRING

    for i in range(0, 1001, 100):
        TEST_STRING = STRING*i

        print "=====", i, "====="
        
        t = timeit.Timer("replace()", "from __main__ import *")
        tr = t.timeit(number=COUNT)/COUNT
        print "REPLACE:  %15.15f" % (tr)
        
        t = timeit.Timer("regular()", "from __main__ import *")
        tre = t.timeit(number=COUNT)/COUNT
        print "RE:       %15.15f" % (tre)

        print "-> ", tr/tre
        print
Schritt für Schritt wird die Länge des Strings, in dem ein Wort ersetzt werden soll vergrößert. Als Zusatzinformation wird das Geschwindigkeitsverhältnis von "replace" und "sub" am Ende berechnet. Interessant ist, dass je länger das zu bearbeitende Wort ist, desto schneller (im Verhältnis zu "replace") wird die "sub"-Variante:

Code: Alles auswählen

===== 0 =====
REPLACE:  0.000001014194592
RE:       0.000005631046075
->  0.180107670648

===== 100 =====
REPLACE:  0.000031614409394
RE:       0.000059381635010
->  0.532393717162

===== 200 =====
REPLACE:  0.000060262774250
RE:       0.000107830256506
->  0.558867021215

===== 300 =====
REPLACE:  0.000089226567842
RE:       0.000156053703367
->  0.571768345879

===== 400 =====
REPLACE:  0.000117313255450
RE:       0.000195798491038
->  0.599153010978

===== 500 =====
REPLACE:  0.000145450232714
RE:       0.000236833355166
->  0.614145894323

===== 600 =====
REPLACE:  0.000175975089089
RE:       0.000287759346771
->  0.611535614962

===== 700 =====
REPLACE:  0.000209176422948
RE:       0.000366832805796
->  0.570222781722

===== 800 =====
REPLACE:  0.000257442032534
RE:       0.000415240433882
->  0.619983054463

===== 900 =====
REPLACE:  0.000268345219547
RE:       0.000421568537955
->  0.636539958246

===== 1000 =====
REPLACE:  0.000297060085279
RE:       0.000463304847019
->  0.641176295027
Antworten