从函数调用中分配多个 return 值的性能
Performance of assigning multiple return values from function call
我想知道是否有一种方法可以将函数的输出分配给变量,而只需要 运行 函数一次。例如,假设我有一个这样的函数:
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]
但据我了解,上面的每一行都需要函数再次 运行。如果我有更长的功能,同时分配它们会更方便,只运行一次功能。有办法吗?
是的,你可以通过序列解包来做到这一点:
def my_func(x):
return x+1, x**2, x**3
var1, var2, var3 = my_func(2)
文档中描述了此功能:Tuples and Sequences
两种可能:
将函数的 return 值(即 tuple
)分配给变量,并访问其元素:
var = my_func(2)
var1 = var[0]
var2 = var[1]
var3 = var[2]
或使用解包:
var1, var2, var3 = my_func(2)
回复:在大多数情况下哪种方法运行得更快?
让我们来比较反汇编(我用 >
强调了差异):
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),而第二种方法在创建变量时多执行一条指令。
差异实际上没有意义。
我想知道是否有一种方法可以将函数的输出分配给变量,而只需要 运行 函数一次。例如,假设我有一个这样的函数:
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]
但据我了解,上面的每一行都需要函数再次 运行。如果我有更长的功能,同时分配它们会更方便,只运行一次功能。有办法吗?
是的,你可以通过序列解包来做到这一点:
def my_func(x):
return x+1, x**2, x**3
var1, var2, var3 = my_func(2)
文档中描述了此功能:Tuples and Sequences
两种可能:
将函数的 return 值(即 tuple
)分配给变量,并访问其元素:
var = my_func(2)
var1 = var[0]
var2 = var[1]
var3 = var[2]
或使用解包:
var1, var2, var3 = my_func(2)
回复:在大多数情况下哪种方法运行得更快?
让我们来比较反汇编(我用 >
强调了差异):
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),而第二种方法在创建变量时多执行一条指令。
差异实际上没有意义。