Python if 不等于 vs if !=

2024-04-20 04:58:55 发布

您现在位置:Python中文网/ 问答频道 /正文

这两行代码的区别是什么:

if not x == 'val':

以及

if x != 'val':

一个比另一个更有效率吗?

最好用

if x == 'val':
    pass
else:

Tags: 代码ifnotvalpasselse区别有效率
3条回答

在第一种情况下,Python必须执行一个以上的操作(而不是仅仅检查不等于它必须检查它是否为真,即它是否等于,因此还要执行一个以上的操作)。无法区分一次执行的区别,但如果多次运行,第二次执行的效率会更高。总的来说,我会用第二个,但数学上是一样的

@jornsharpe对发生的事情有很好的解释。我想我只需要在运行3个选项中的每一个10000000次时显示时间的差异(足够显示一个细微的差异)。

使用的代码:

def a(x):
    if x != 'val':
        pass


def b(x):
    if not x == 'val':
        pass


def c(x):
    if x == 'val':
        pass
    else:
        pass


x = 1
for i in range(10000000):
    a(x)
    b(x)
    c(x)

而cProfile profiler的结果是:

enter image description here

所以我们可以看到,if not x == 'val':if x != 'val':之间有非常微小的差别,大约0.7%。其中,if x != 'val':是最快的。 然而,最令人惊讶的是,我们可以看到

if x == 'val':
        pass
    else:

实际上是最快的,比if x != 'val':快约0.3%。这不是很可读,但我想如果你想要一个微不足道的性能改进,可以走这条路。

使用^{}查看为两个版本生成的字节码:

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   

后者的操作更少,因此效率可能略高一些。


有人指出,in the commments(谢谢,@Quincunx)你有if foo != barif 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__的实现。每the data model documentation

There are no implied relationships among the comparison operators. The truth of x==y does not imply that x!=y is false.

例如:

>>> class Dummy(object):
    def __eq__(self, other):
        return True
    def __ne__(self, other):
        return True


>>> not Dummy() == Dummy()
False
>>> Dummy() != Dummy()
True

最后,也许也是最重要的:一般来说,如果两个在逻辑上是相同的,那么x != ynot x == y更具可读性。

相关问题 更多 >