Từ trang này , chúng tôi biết rằng:
So sánh xích được nhanh hơn so với sử dụng
and
toán tử. Viếtx < y < z
thay chox < y and y < z
.
Tuy nhiên, tôi đã nhận được một kết quả khác khi kiểm tra các đoạn mã sau:
$ 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
Có vẻ như x < y and y < z
là nhanh hơn x < y < z
. Tại sao?
Sau khi tìm kiếm một số bài đăng trong trang web này (như bài này ) tôi biết rằng "chỉ được đánh giá một lần" là chìa khóa x < y < z
, tuy nhiên tôi vẫn bối rối. Để nghiên cứu thêm, tôi đã phân tách hai chức năng này bằng cách sử dụng 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)
Và đầu ra là:
## 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)
Có vẻ như các x < y and y < z
lệnh có ít sự khác biệt hơn x < y < z
. Tôi có nên xem xét x < y and y < z
nhanh hơn x < y < z
?
Đã thử nghiệm với Python 2.7.6 trên CPU Intel (R) Xeon (R) E5640 @ 2.67GHz.
y
không chỉ là một tra cứu biến đổi, mà là một quá trình tốn kém hơn như một cuộc gọi hàm? Tức 10 < max(range(100)) < 15
là nhanh hơn 10 < max(range(100)) and max(range(100)) < 15
vì max(range(100))
được gọi một lần cho cả hai so sánh.
timeit
bài kiểm tra của bạn, tôi đã quan tâm đến điều này.