Ich finde die Lösung von Sven Marnach und FJ wunderschön, aber in meinem kleinen Test nicht schneller. Dies ist die optimierte Version von Raymond, die eine vorberechnete Version verwendet set
:
$ python -m timeit -s "choices = set('abc')" \
-s "x = 'c'" \
-s "y = 'a'" \
"z, = choices - set(x + y)"
1000000 loops, best of 3: 0.689 usec per loop
Dies ist die ursprüngliche Lösung:
$ python -m timeit -s "x = 'c'" \
-s "y = 'a'" \
"if x == 'a' and y == 'b' or x == 'b' and y == 'a':" \
" z = 'c'" \
"elif x == 'b' and y == 'c' or x == 'c' and y == 'b':" \
" z = 'a'" \
"elif x == 'a' and y == 'c' or x == 'c' and y == 'a':" \
" z = 'b'"
10000000 loops, best of 3: 0.310 usec per loop
Beachten Sie, dass dies die schlechteste Eingabe für die if
Anweisungen ist, da alle sechs Vergleiche ausprobiert werden müssen. Testen mit allen Werten für x
und y
ergibt:
x = 'a', y = 'b': 0.084 usec per loop
x = 'a', y = 'c': 0.254 usec per loop
x = 'b', y = 'a': 0.133 usec per loop
x = 'b', y = 'c': 0.186 usec per loop
x = 'c', y = 'a': 0.310 usec per loop
x = 'c', y = 'b': 0.204 usec per loop
Die set
basierende Variante zeigt für verschiedene Eingänge die gleiche Leistung, ist jedoch durchweg zwischen 2 und 8 Mal langsamer . Der Grund ist, dass die if
-basierte Variante viel einfacheren Code ausführt: Gleichheitstests im Vergleich zu Hashing.
Ich denke, beide Arten von Lösungen sind wertvoll: Es ist wichtig zu wissen, dass das Erstellen "komplizierter" Datenstrukturen wie Sets Sie etwas an Leistung kostet - während sie Ihnen viel Lesbarkeit und Entwicklungsgeschwindigkeit bieten . Die komplexen Datentypen sind auch viel besser, wenn sich der Code ändert: Es ist einfach, die satzbasierte Lösung auf vier, fünf, ... Variablen zu erweitern, während die if-Anweisungen schnell zu einem Wartungsalptraum werden.