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的结果是:
所以我们可以看到,if not x == 'val':和if x != 'val':之间有非常微小的差别,大约0.7%。其中,if x != 'val':是最快的。
然而,最令人惊讶的是,我们可以看到
if x == 'val':
pass
else:
实际上是最快的,比if x != 'val':快约0.3%。这不是很可读,但我想如果你想要一个微不足道的性能改进,可以走这条路。
在第一种情况下,Python必须执行一个以上的操作(而不是仅仅检查不等于它必须检查它是否为真,即它是否等于,因此还要执行一个以上的操作)。无法区分一次执行的区别,但如果多次运行,第二次执行的效率会更高。总的来说,我会用第二个,但数学上是一样的
@jornsharpe对发生的事情有很好的解释。我想我只需要在运行3个选项中的每一个10000000次时显示时间的差异(足够显示一个细微的差异)。
使用的代码:
而cProfile profiler的结果是:
所以我们可以看到,
if not x == 'val':
和if x != 'val':
之间有非常微小的差别,大约0.7%。其中,if x != 'val':
是最快的。 然而,最令人惊讶的是,我们可以看到实际上是最快的,比
if x != 'val':
快约0.3%。这不是很可读,但我想如果你想要一个微不足道的性能改进,可以走这条路。使用^{} 查看为两个版本生成的字节码:
not ==
!=
后者的操作更少,因此效率可能略高一些。
有人指出,in the commments(谢谢,@Quincunx)你有
if foo != bar
对if not foo == bar
的操作数是完全相同的,只是COMPARE_OP
改变了,并且POP_JUMP_IF_TRUE
切换到POP_JUMP_IF_FALSE
:not ==
:!=
在这种情况下,除非每次比较所需的工作量有所不同,否则您不太可能看到任何性能差异。
但是,请注意,这两个版本的在逻辑上并不总是相同的,因为它将取决于有关对象的
__eq__
和__ne__
的实现。每the data model documentation:例如:
最后,也许也是最重要的:一般来说,如果两个在逻辑上是相同的,那么
x != y
比not x == y
更具可读性。相关问题 更多 >
编程相关推荐