에서 이 페이지에 , 우리는 것을 알고있다 :
연쇄 비교는
and
연산자를 사용하는 것보다 빠릅니다 .x < y < z
대신 쓰십시오x < y and y < z
.
그러나 다음 코드 스 니펫을 테스트하는 다른 결과가 있습니다.
$ 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
그 것 x < y and y < z
보다 더 빨리이다 x < y < z
. 왜?
(같은이 사이트의 일부 게시물을 검색 한 후 이 중 하나 ) 나는 그 "한 번만 평가"에 대한 핵심을 알고 x < y < z
하지만 난 여전히 혼란스러워하고 있습니다. 추가 연구를 위해 다음 두 가지 기능을 사용하여 분해했습니다 dis.dis
.
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)
그리고 출력은 다음과 같습니다
## 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)
x < y and y < z
보다 명령이 덜 유사 해 보입니다 x < y < z
. x < y and y < z
보다 빨리 고려해야 x < y < z
합니까?
2.67GHz @ Intel Xeon CPU E5640에서 Python 2.7.6으로 테스트되었습니다.
y
가 단순히 변수 조회가 아니라 함수 호출과 같은 더 비싼 프로세스 일 때 발생한다고 가정했습니다 . 즉 , 두 비교 모두에 대해 한 번 호출 되기 때문에 10 < max(range(100)) < 15
보다 빠릅니다 . 10 < max(range(100)) and max(range(100)) < 15
max(range(100))
timeit
테스트를 보면 이것에 관심이 있습니다.