Benchmark: joinen...

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:

Benchmark: joinen...

Beitragvon jens » Montag 14. Mai 2007, 14:18

Ein Sinnloser Benchmark:

Code: Alles auswählen

import timeit, os

loop = 5000000

tests = (
    ("'%s/%s' % ('eins','zwei')", ""),
    ("'/'.join(('eins','zwei'))", ""),
    ("'/'.join(['eins','zwei'])", ""),
    ("os.sep.join(('eins','zwei'))", "import os"),
    ("posixpath.join(('eins','zwei'))", "import posixpath"),
)

for no, test in enumerate(tests):
    print "%s - %s" % (no+1, test[0])

    test = timeit.Timer(test[0], test[1])
    print "%.2f" % test.timeit(number=loop)

    print

Ausgabe:

Code: Alles auswählen

1 - '%s/%s' % ('eins','zwei')
1.96

2 - '/'.join(('eins','zwei'))
1.84

3 - '/'.join(['eins','zwei'])
3.00

4 - os.sep.join(('eins','zwei'))
2.30

5 - posixpath.join(('eins','zwei'))
3.28


Eigentlich wollte ich nur wissen, was schneller ist: '%s/%s' % ('eins','zwei') oder '/'.join(('eins','zwei'))
Dumm ist, wenn man in der zweiten Variante eine Liste angibt. Wobei das IMHO besser zu lesen ist...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
thelittlebug
User
Beiträge: 187
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

Beitragvon thelittlebug » Montag 14. Mai 2007, 18:13

sobald man psyco verwendet schaut das irgendwie wieder alles ganz anders aus.

Code: Alles auswählen

import psyco
psyco.full()


zur info: ohne psyco dauert bei mir der test ca. doppelt so lange wie bei dir

Code: Alles auswählen

1 - '%s/%s' % ('eins','zwei')
2.55

2 - '/'.join(('eins','zwei'))
1.32

3 - '/'.join(['eins','zwei'])
2.08

4 - os.sep.join(('eins','zwei'))
1.66

5 - posixpath.join(('eins','zwei'))
0.76


lgherby
Benutzeravatar
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Beitragvon mitsuhiko » Montag 14. Mai 2007, 18:47

Toll. Du misst da hauptsächlich wie schnell Python Variablen auflösen kann... :roll:
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 28. Juni 2007, 09:03

thelittlebug hat geschrieben:sobald man psyco verwendet schaut das irgendwie wieder alles ganz anders aus.

Gut. Aber eigentlich geht es mit oft genug nicht wirklich um Pfade, sondern einfach nur darum zwei String zu verbinden.

Hier mal ein anderer Test:

Code: Alles auswählen

import timeit

loop = 2000000

vars = "var1='bla'; var2='blub'"
tests = (
    ('cache_key = "_".join([var1, var2])',  vars),
    ('cache_key = "_".join((var1, var2))',  vars),
    ('cache_key = "%s_%s" % (var1, var2)',  vars),
    ('cache_key = var1 + "_" + var2',       vars),
)

for no, test in enumerate(tests):
    print "%s - %s" % (no+1, test[0])

    test = timeit.Timer(test[0], test[1])
    print "%.2f" % test.timeit(number=loop)

    print

Ergebnis:
1 - cache_key = "_".join([var1, var2])
1.35

2 - cache_key = "_".join((var1, var2))
0.93

3 - cache_key = "%s_%s" % (var1, var2)
0.94

4 - cache_key = var1 + "_" + var2
0.53


Hätte ich jetzt nicht erwartet, das die letzte Variante die schnellste ist. Denn die hatte ich mir eigentlich abgewöhnt :roll:

@thelittlebug: Kannst du den test auch mal mit psyco machen?

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

Beitragvon BlackJack » Donnerstag 28. Juni 2007, 18:15

Ich hätte schon erwartet, dass Variante 4 die schnellste ist, aber ich finde 3 trotzdem besser, weil zumindest für mich lesbarer.

Bei 4 wird zwar eine Zeichenkette (``var1 + '_'``) erzeugt, die nicht benötigt wird, aber bei 3 wird ein Tupel erzeugt, die Formatierungszeichenkette muss geparst werden und für `var1` und `var2` wird `str()` aufgerufen.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]