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.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
thelittlebug
User
Beiträge: 188
Registriert: Donnerstag 20. Juli 2006, 20:46
Wohnort: Wien
Kontaktdaten:

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
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
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.
Antworten