为啥“真或假”比“假或真”快? [复制]

Posted

技术标签:

【中文标题】为啥“真或假”比“假或真”快? [复制]【英文标题】:Why is 'True or False' faster than 'False or True'? [duplicate]为什么“真或假”比“假或真”快? [复制] 【发布时间】:2015-12-05 02:55:13 【问题描述】:

我运行了代码

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就会短路。 完全不相关,但如果您想了解 stdlib 的 timeit 模块... @ajcr 短路。我不知道那件事。谢谢。 【参考方案1】:

这是因为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

【讨论】:

【参考方案2】:

因为or 的评估是惰性的,如果找到True 则不需要更多检查;而如果第一个是False,则它必须评估下一个表达式,直到找到True 或不再进行检查。

【讨论】:

以上是关于为啥“真或假”比“假或真”快? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 jQuery 查找返回真或假? [复制]

我应该使用 Any() 还是 Count() ?哪个更快?如果 IEnumerable 对象中存在任何数据,两者都会返回相同的输出(真或假)吗? [复制]

“返回 x == y”是啥意思? [复制]

斑马对话js - 试图返回一个值假或真

为啥“.concat(String)”比“+”快这么多? [复制]

为啥性能测试显示我的代码列表比数组快得多? [复制]