Seite 1 von 1

Benchmark: joinen...

Verfasst: Montag 14. Mai 2007, 14:18
von jens
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...

Verfasst: Montag 14. Mai 2007, 18:13
von thelittlebug
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

Verfasst: Montag 14. Mai 2007, 18:47
von mitsuhiko
Toll. Du misst da hauptsächlich wie schnell Python Variablen auflösen kann... :roll:

Verfasst: Donnerstag 28. Juni 2007, 09:03
von jens
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?

Verfasst: Donnerstag 28. Juni 2007, 18:15
von BlackJack
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.