在 python 函数中省略和包含 return 语句之间是否存在性能差异?

问题描述 投票:0回答:1

假设我们有一个函数可以像这样更新类中的一堆内部值:

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 函数内部的条件非常复杂且嵌套较多;该程序也处理大量数据。

python execution-time
1个回答
-1
投票

你可以看看生成的字节码来回答这个问题:

带有明确的

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)
© www.soinside.com 2019 - 2024. All rights reserved.