"string in string" vs. "string.find(string)&q

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.
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

"string in string" vs. "string.find(string)&q

Beitragvon jens » 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:

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)

Ausgabe:
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%


Demnach kann man ganz gut sehen, das "in" bei kleinen Texten schneller ist, aber wenn der Text länger wird, ist .find() schneller...
Bei den Sinnlosen vergleichen (unten, wenn der Such-Text größer ist, wie der eigentliche Text) ist in immer schneller...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Dienstag 13. Juni 2006, 11:18

Ich hab einen Fehler gemacht... Ein if text2.find(text1): reicht nicht. Es muß ehr if text2.find(text1)!=-1: lauten! Das ändert am "Preformance" Ergebniss nicht sehr viel...

Wenn bei .find() der String nicht gefunden wurde, wird -1 zurück geliefert. Und bool(-1) ist True...


Was ich nicht wuste, das "in" auch bei Python2.2 funktioniert, aber nur wenn der Such-String ein Zeichen lang ist... Also if "b" in "abc": geht...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]