为什么 'True or False' 比 'False or True' 快?
Why is 'True or False' faster than 'False or True'?
我运行代码
a = True
b = False
c = False
d = False
e = False
import time
iterations = int(1e6)
start = time.time()
for _ in range(iterations):
a or b or c or d or e
print(time.time() - start)
start = time.time()
for _ in range(iterations):
b or c or d or e or a
print(time.time() - start)
结果
0.10876178741455078
0.26296424865722656
- 为什么布尔运算的顺序会影响速度?
- 是否因为某种形式的优化?
- 如果有,有我可以阅读的资源吗?
因为 or
延迟计算,如果找到 True
则不需要更多检查;而如果第一个是 False
则它必须评估下一个表达式,直到找到 True
或没有更多检查。
这是因为short-circuiting:
True or WHATEVER # always True
在第一个表达式a
中,True
在前,无需继续。
展示这一点的一个很酷的方法是使用一段永远不会 运行 因为短路的代码:
>>> def _print():
... print "no short circuit"
...
>>> True or _print()
True
>>> False or _print()
no short circuit
我运行代码
a = True
b = False
c = False
d = False
e = False
import time
iterations = int(1e6)
start = time.time()
for _ in range(iterations):
a or b or c or d or e
print(time.time() - start)
start = time.time()
for _ in range(iterations):
b or c or d or e or a
print(time.time() - start)
结果
0.10876178741455078
0.26296424865722656
- 为什么布尔运算的顺序会影响速度?
- 是否因为某种形式的优化?
- 如果有,有我可以阅读的资源吗?
因为 or
延迟计算,如果找到 True
则不需要更多检查;而如果第一个是 False
则它必须评估下一个表达式,直到找到 True
或没有更多检查。
这是因为short-circuiting:
True or WHATEVER # always True
在第一个表达式a
中,True
在前,无需继续。
展示这一点的一个很酷的方法是使用一段永远不会 运行 因为短路的代码:
>>> def _print():
... print "no short circuit"
...
>>> True or _print()
True
>>> False or _print()
no short circuit