小编典典

Python if not == vs if !=

all

这两行代码有什么区别:

if not x == 'val':

if x != 'val':

一个比另一个更有效吗?

使用会不会更好

if x == 'val':
    pass
else:

阅读 157

收藏
2022-07-02

共1个答案

小编典典

用于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

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__对象的实现。根据数据模型文档

比较运算符之间没有隐含的关系。的真理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.

2022-07-02