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?
Leistung von re.sub und .replace
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:
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
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
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