使用
dis一下两个版本生成的字节码:
not ==
40 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 2 (==) 9 UNARY_NOT 10 RETURN_VALUE
!=
40 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 3 (!=) 9 RETURN_VALUE
后者的操作较少,因此效率可能会略高一些。
在致谢中指出了),您所进行的操作
iffoo != bar与
if not foo ==bar操作数量完全相同,只是
COMPARE_OP更改并
POP_JUMP_IF_TRUE切换为
POP_JUMP_IF_FALSE:
not ==
:
20 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 2 (==) 9 POP_JUMP_IF_TRUE 16
!=
20 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 3 (!=) 9 POP_JUMP_IF_FALSE 16
在这种情况下,除非每次比较所需的工作量有所不同,否则您根本看不到任何性能差异。
但是,请注意,这两个版本 不会永远是逻辑上相同的
,因为这将取决于实现方式
__eq__和
__ne__有问题的对象。根据数据模型文档:
比较运算符之间没有隐含的关系。的真相
x==y并不意味着那x!=y是错误的。
例如:
>>> class Dummy(object): def __eq__(self, other): return True def __ne__(self, other): return True>>> not Dummy() == Dummy()False>>> Dummy() != Dummy()True
最后,也许是最重要的一点:通常,两者 在 逻辑上相同, x != y
因此可读性比not x == y
。



