"string in string" vs. "string.find(string)&q
Verfasst: Montag 12. Juni 2006, 16:39
Ich kümmere mich gerade darum, das die neue PyLucid Version (somit auch colubrid/jinja) auch wieder mit Python 2.2.x funktioniert (Damit ich es auch auf meinem Webspace einsetzten kann)
Das man mit "in" prüfen kann ob ein String in einem anderen String enthalten ist, kann man erst mit Python 2.3 (Glaub ich. Auf jeden Fall geht's nicht mit 2.2)... Als Ersatz kann man .find() nehmen...
Nun hab ich mich gefragt, was wohl schneller ist und einen kleinen Test geschrieben:
Ausgabe:
Bei den Sinnlosen vergleichen (unten, wenn der Such-Text größer ist, wie der eigentliche Text) ist in immer schneller...
Das man mit "in" prüfen kann ob ein String in einem anderen String enthalten ist, kann man erst mit Python 2.3 (Glaub ich. Auf jeden Fall geht's nicht mit 2.2)... Als Ersatz kann man .find() nehmen...
Nun hab ich mich gefragt, was wohl schneller ist und einen kleinen Test geschrieben:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
import time, os
test_time = 0.5
def test(test1_len, text2_len):
text1 = os.urandom(test1_len)
text2 = os.urandom(text2_len)
print "text len: %s - %s" % (test1_len, text2_len)
start_time = time.time()
loops1 = 0
while 1:
loops1 += 1
if text1 in text2:
pass
if time.time()-start_time > test_time:
break
print "in....:", loops1
start_time = time.time()
loops2 = 0
while 1:
loops2 += 1
if text2.find(text1):
pass
if time.time()-start_time > test_time:
break
print "find..:", loops2
if loops1>loops2:
print "> in %.0f%%" % (float(loops1)/loops2 * 100)
else:
print "> find %.0f%%" % (float(loops2)/loops1 * 100)
print
test(1, 1)
test(2, 100)
test(10, 100)
test(10, 10000)
test(100, 1000000)
print "-"*79
test(10000, 10000)
print "-"*79
test(100, 10)
test(10000, 10)
test(1000000, 100)
Demnach kann man ganz gut sehen, das "in" bei kleinen Texten schneller ist, aber wenn der Text länger wird, ist .find() schneller...text len: 1 - 1
in....: 503799
find..: 319310
> in 158%
text len: 2 - 100
in....: 248214
find..: 275427
> find 111%
text len: 10 - 100
in....: 259065
find..: 280503
> find 108%
text len: 10 - 10000
in....: 4790
find..: 19609
> find 409%
text len: 100 - 1000000
in....: 47
find..: 200
> find 426%
-------------------------------------------------------------------------------
text len: 10000 - 10000
in....: 499897
find..: 320128
> in 156%
-------------------------------------------------------------------------------
text len: 100 - 10
in....: 502168
find..: 322574
> in 156%
text len: 10000 - 10
in....: 503028
find..: 323522
> in 155%
text len: 1000000 - 100
in....: 496901
find..: 321621
> in 154%
Bei den Sinnlosen vergleichen (unten, wenn der Such-Text größer ist, wie der eigentliche Text) ist in immer schneller...