假设我们有一个函数可以像这样更新类中的一堆内部值:
class MyClass:
def __init__():
self.counter = 0
self.condition_1 = True
self.condition_2 = False
def update():
if self.condition_1:
if self.condition_2:
self.counter += 2
# return or not?
else:
self.counter += 1
# return or not?
else:
self.counter -= 1
# return or not?
更新函数在有或没有 return 语句的情况下执行得更快(在更新变量之后)?还是 100% 相同? (对我来说不太可能)
我知道这听起来像是在没有上下文的情况下提出的一个微不足道/愚蠢的问题,但考虑到这个函数被重复调用了数千次,所以函数内性能的轻微提高会对整个程序的执行速度产生很大的影响.
在我的真实程序中,update 函数内部的条件非常复杂且嵌套较多;该程序也处理大量数据。
你可以看看生成的字节码来回答这个问题:
带有明确的
return
s:
4 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (counter)
5 4 NOP
6 6 NOP
7 8 LOAD_FAST 0 (counter)
10 LOAD_CONST 3 (2)
12 INPLACE_ADD
14 STORE_FAST 0 (counter)
8 16 LOAD_CONST 0 (None)
18 RETURN_VALUE
没有明确的
return
s:
17 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (counter)
18 4 NOP
19 6 NOP
20 8 LOAD_FAST 0 (counter)
10 LOAD_CONST 3 (2)
12 INPLACE_ADD
14 STORE_FAST 0 (counter)
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
如您所见,它们产生相同的字节码。版本是等效的。
测试代码:
from dis import dis
def update1():
counter = 0
if True:
if True:
counter += 2
return
else:
counter += 1
return
else:
counter -= 1
return
def update2():
counter = 0
if True:
if True:
counter += 2
# return or not?
else:
counter += 1
# return or not?
else:
counter -= 1
# return or not?
dis(update1)
print("-" * 100)
dis(update2)