这两行代码有什么区别:
if not x == 'val':
和
if x != 'val':
一个比另一个更有效吗?
使用会不会更好
if x == 'val': pass else:
用于dis查看为两个版本生成的字节码:
dis
not ==
4 0 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 2 (==) 9 UNARY_NOT 10 RETURN_VALUE
!=
4 0 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 3 (!=) 9 RETURN_VALUE
后者的操作较少,因此可能会稍微更有效率。
评论]中指出(
请注意,多一条指令并不总是正确的。not x == y当我将代码放入 anif时,结果发现它们都有相同数量的指令,只有一个有POP_JUMP_IF_TRUE另一个POP_JUMP_IF_FALSE(这是它们之间的唯一区别,除了使用不同的COMPARE_OP)。当我编译没有ifs 的代码时,我得到了你所得到的),
您拥有的位置与操作的数量完全相同,只是更改并切换到:if foo != bar``if not foo == bar``COMPARE_OP``POP_JUMP_IF_TRUE``POP_JUMP_IF_FALSE
if foo != bar``if not foo == bar``COMPARE_OP``POP_JUMP_IF_TRUE``POP_JUMP_IF_FALSE
not == :
2 0 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 2 (==) 9 POP_JUMP_IF_TRUE 16
2 0 LOAD_FAST 0 (foo) 3 LOAD_FAST 1 (bar) 6 COMPARE_OP 3 (!=) 9 POP_JUMP_IF_FALSE 16
在这种情况下,除非每次比较所需的工作量有所不同,否则您根本不可能看到任何性能差异。
但是,请注意,这两个版本 在逻辑上并不总是相同__eq__的,因为它取决于所讨论__ne__对象的实现。根据数据模型文档:
__eq__
__ne__
比较运算符之间没有隐含的关系。的真理x==y并不意味着它x!=y是错误的。
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.
x != y
not x == y