【问题标题】:Performance of assigning multiple return values from function call [duplicate]从函数调用分配多个返回值的性能[重复]
【发布时间】:2018-10-15 11:03:41
【问题描述】:

我想知道是否有一种方法可以将函数的输出分配给变量,而只需运行一次函数。例如,假设我有一个这样的函数:

def my_func(x):
    return x+1, x**2, x**3

然后我想将每个输出存储为一个变量,所以通常我会在之后编码:

var1 = my_func(2)[0]
var2 = my_func(2)[1]
var3 = my_func(2)[2]

但据我了解,上面的每一行都需要再次运行该函数。如果我有更长的函数,同时分配它们会更方便,只运行一次函数。有没有办法做到这一点?

【问题讨论】:

    标签: python python-2.7 function assign


    【解决方案1】:

    两种可能:

    将函数的返回值(tuple)分配给变量,并访问其元素:

    var = my_func(2)
    var1 = var[0]
    var2 = var[1]
    var3 = var[2]
    

    或使用解包:

    var1, var2, var3 = my_func(2)
    

    Re: 大多数情况下哪种方法运行得更快?

    让我们比较一下反汇编(我用>强调了差异):

    dis.dis('t=my_func(2);d=t[0]+t[1]+t[2]')

      1           0 LOAD_NAME                0 (my_func)
                  2 LOAD_CONST               0 (2)
                  4 CALL_FUNCTION            1
               >  6 STORE_NAME               1 (t)
                  8 LOAD_NAME                1 (t)
               > 10 LOAD_CONST               1 (0)
               > 12 BINARY_SUBSCR
                 14 LOAD_NAME                1 (t)
               > 16 LOAD_CONST               2 (1)
               > 18 BINARY_SUBSCR
                 20 BINARY_ADD
                 22 LOAD_NAME                1 (t)
               > 24 LOAD_CONST               0 (2)
               > 26 BINARY_SUBSCR
                 28 BINARY_ADD
                 30 STORE_NAME               2 (d)
                 32 LOAD_CONST               3 (None)
                 34 RETURN_VALUE
    

    dis.dis('a,b,c=my_func(2);d=a+b+c')

      1           0 LOAD_NAME                0 (my_func)
                  2 LOAD_CONST               0 (2)
                  4 CALL_FUNCTION            1
              >   6 UNPACK_SEQUENCE          3
              >   8 STORE_NAME               1 (a)
              >  10 STORE_NAME               2 (b)
              >  12 STORE_NAME               3 (c)
                 14 LOAD_NAME                1 (a)
                 16 LOAD_NAME                2 (b)
                 18 BINARY_ADD
                 20 LOAD_NAME                3 (c)
                 22 BINARY_ADD
                 24 STORE_NAME               4 (d)
                 26 LOAD_CONST               1 (None)
                 28 RETURN_VALUE
    

    因此,第一种方法在每次使用变量时多执行两条指令(LOAD_CONST、BINARY_SUBSCR),而第二种方法在创建变量时多执行一条指令。

    差异实际上没有意义。

    【讨论】:

    • 哪种方法在大多数情况下运行得更快?
    • @WynneT 我猜是后者,但数量可能毫无意义。
    • @WynneT:查看我的编辑
    【解决方案2】:

    是的,您可以通过序列解包来做到这一点:

    def my_func(x):
        return x+1, x**2, x**3
    
    var1, var2, var3 = my_func(2)
    

    此功能在文档中有所描述:Tuples and Sequences

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      相关资源
      最近更新 更多