Von dieser Seite wissen wir, dass:
Verkettete Vergleiche sind schneller als mit dem
andOperator. Schreibenx < y < zstattx < y and y < z.
Ich habe jedoch ein anderes Ergebnis beim Testen der folgenden Codefragmente erhalten:
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.8" "x < y < z"
1000000 loops, best of 3: 0.322 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.8" "x < y and y < z"
1000000 loops, best of 3: 0.22 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.1" "x < y < z"
1000000 loops, best of 3: 0.279 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.1" "x < y and y < z"
1000000 loops, best of 3: 0.215 usec per loop
Es scheint, dass x < y and y < zdas schneller ist als x < y < z. Warum?
Nachdem ich einige Beiträge auf dieser Site durchsucht habe (wie diese hier ), weiß ich, dass "nur einmal bewertet" der Schlüssel ist x < y < z, aber ich bin immer noch verwirrt. Um weitere Studien durchzuführen, habe ich diese beiden Funktionen mit dis.disfolgenden Komponenten zerlegt :
import dis
def chained_compare():
x = 1.2
y = 1.3
z = 1.1
x < y < z
def and_compare():
x = 1.2
y = 1.3
z = 1.1
x < y and y < z
dis.dis(chained_compare)
dis.dis(and_compare)
Und die Ausgabe ist:
## chained_compare ##
4 0 LOAD_CONST 1 (1.2)
3 STORE_FAST 0 (x)
5 6 LOAD_CONST 2 (1.3)
9 STORE_FAST 1 (y)
6 12 LOAD_CONST 3 (1.1)
15 STORE_FAST 2 (z)
7 18 LOAD_FAST 0 (x)
21 LOAD_FAST 1 (y)
24 DUP_TOP
25 ROT_THREE
26 COMPARE_OP 0 (<)
29 JUMP_IF_FALSE_OR_POP 41
32 LOAD_FAST 2 (z)
35 COMPARE_OP 0 (<)
38 JUMP_FORWARD 2 (to 43)
>> 41 ROT_TWO
42 POP_TOP
>> 43 POP_TOP
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
## and_compare ##
10 0 LOAD_CONST 1 (1.2)
3 STORE_FAST 0 (x)
11 6 LOAD_CONST 2 (1.3)
9 STORE_FAST 1 (y)
12 12 LOAD_CONST 3 (1.1)
15 STORE_FAST 2 (z)
13 18 LOAD_FAST 0 (x)
21 LOAD_FAST 1 (y)
24 COMPARE_OP 0 (<)
27 JUMP_IF_FALSE_OR_POP 39
30 LOAD_FAST 1 (y)
33 LOAD_FAST 2 (z)
36 COMPARE_OP 0 (<)
>> 39 POP_TOP
40 LOAD_CONST 0 (None)
Es scheint, dass der x < y and y < zBefehl weniger uneinheitlich ist als x < y < z. Sollte ich x < y and y < zschneller überlegen als x < y < z?
Getestet mit Python 2.7.6 auf einer Intel (R) Xeon (R) CPU E5640 bei 2,67 GHz.
yes sich nicht nur um eine variable Suche handelt, sondern um einen teureren Prozess wie einen Funktionsaufruf. Dh 10 < max(range(100)) < 15ist schneller als 10 < max(range(100)) and max(range(100)) < 15weil max(range(100))für beide Vergleiche einmal aufgerufen wird.
timeitTests sah, interessierte ich mich dafür.