41 ROT_T-6ren">
gpt4 book ai didi

python - "x < y < z"比 "x < y and y < z"快吗?

转载 作者:IT老高 更新时间:2023-10-28 12:32:17 25 4
gpt4 key购买 nike

来自 this page ,我们知道:

Chained comparisons are faster than using the and operator. Write x < y < z instead of 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 < zx < y < z 快. 为什么?

在本站搜索了一些帖子(如 this one )后,我知道“只评估一次”是 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 ?

在 Intel(R) Xeon(R) CPU E5640 @ 2.67GHz 上使用 Python 2.7.6 进行测试。

最佳答案

区别在于x < y < z y只评估一次。如果 y 是一个变量,这并没有太大的区别,但是当它是一个函数调用时,它会产生很大的差异,这需要一些时间来计算。

from time import sleep
def y():
sleep(.2)
return 1.3
%timeit 1.2 < y() < 1.8
10 loops, best of 3: 203 ms per loop
%timeit 1.2 < y() and y() < 1.8
1 loops, best of 3: 405 ms per loop

关于python - "x < y < z"比 "x < y and y < z"快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34014906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com