from time import perf_counter
from random import randint
def eq_compare(x):
return x == False
def not_compare(x):
return not x
lst = [[], {}, (), 1, 2, 3, True, None] + [randint(0, 10_000) for _ in range(1000)]
s = perf_counter()
for i in lst * 1000:
eq_compare(i)
print(perf_counter() - s)
s = perf_counter()
for i in lst * 100:
not_compare(i)
print(perf_counter() - s)
PEP 285将帮助我们回答这个问题:
缩写翻译:
特别是,刚刚学习布尔变量的初学者很可能会写出
if x == True:而不是正确的形式if x:运行此检查:
通过运算符检查的速度
not比通过相等运算符检查的速度快10倍以上。以下是一些测量值(成对):==:0.11482529999921098
不是:0.009857600030954927
==:0.12146590003976598
不是:0.009981999988667667
==:0.11241040000459179
不是:0.01083189999917522
我认为通过 == 检查的速度很慢是由于动态类型造成的 - 将类型动态转换为 bool 更困难,所以即使这样也比较值。
首先,选项
非常丑陋——该对象
False是单例(singleton,唯一的对象),因此,建议使用运算符==(相同的对象)而不是运算符(相同的值):is来自PEP 8 - Python 代码指南:
不太正确的翻译。英文原文略有不同:
现在,命令
if x is False:if not x:并不总是相同 - 例如,在命令中
if,空字典计算如下False:好吧,现在回答你的问题:
可读性- 比较:
if (option in (1, 5, 6)) is False:和if not option in (1, 5, 6):可读性取决于谁在阅读它。;-) 对我来说,这是第二个选择。
表现:
第二种选择要快一些。但没有说服力。在我看来,Python解释器根本没有提前检测到匹配,没有优化第一个选项。