鉴于以下内容:
def foo():
x = a_method_returning_a_long_list()
y = a_method_which_filters_a_list(x)
return y
Python的字节码编译器会保留x
&内存中y
,还是足够聪明,可以将其减少到以下内容?
def foo():
return a_method_which_filters_a_list(a_method_returning_a_long_list())
答案 0 :(得分:3)
它将x和y保留在内存中:
import dis
dis.dis(foo)
2 0 LOAD_GLOBAL 0 (a_method_returning_a_long_list)
3 CALL_FUNCTION 0
6 STORE_FAST 0 (x)
3 9 LOAD_GLOBAL 1 (a_method_which_filters_a_list)
12 LOAD_FAST 0 (x)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (y)
4 21 LOAD_FAST 1 (y)
24 RETURN_VALUE
整个操作非常有效,因为它是使用LOAD_FAST
和STORE_FAST
代码完成的。
作为其中一条评论中的Roadrunner-EX备注,您的两个foo
版本使用的内存量基本相同,因为x
和y
只是引用(即结果的指针。
答案 1 :(得分:2)
In [1]: import dis
In [2]: def f():
...: x = f1()
...: y = f2(x)
...: return y
...:
In [3]: dis.dis(f)
2 0 LOAD_GLOBAL 0 (f1)
3 CALL_FUNCTION 0
6 STORE_FAST 0 (x)
3 9 LOAD_GLOBAL 1 (f2)
12 LOAD_FAST 0 (x)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (y)
4 21 LOAD_FAST 1 (y)
24 RETURN_VALUE
所以看起来两个变量都是分开存放的。
答案 2 :(得分:0)
我不确定,但我猜它会将它们留在记忆中,原因有两个。首先,它可能比它的价值更多的努力。无论如何都不会有巨大的性能变化。第二,变量x和y本身可能占用内存(以指针/引用的形式),由于赋值的显式特性,编译器不会触及它。