gpt4 book ai didi

Python:分配变量和调用方法的内存效率

转载 作者:太空宇宙 更新时间:2023-11-04 01:15:19 25 4
gpt4 key购买 nike

这个问题困扰了我一段时间。我想知道分配变量和调用方法的比较内存效率。考虑一下,例如:

s = "foo"
x = s.lower()

对比

x = "foo".lower()

哪一个在内存使用方面更有效?

这显然是一个微不足道的例子,但它说明了我想知道的事情。
在许多情况下,我们定义了一些变量 var1 = foo,然后定义了第二个变量 var2 = var1.method()。这个整个过程是否需要比仅仅定义 var2 = foo.method() 更多的内存?

最佳答案

第一种情况下字节码较大,但只是微不足道的数量。

$ python3
Python 3.3.5 (default, Mar 9 2014, 08:10:50)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> def f():
... s = "foo"
... x = s.lower()
... return x
...
>>> def g():
... x = "foo".lower()
... return x
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('foo')
3 STORE_FAST 0 (s)

3 6 LOAD_FAST 0 (s)
9 LOAD_ATTR 0 (lower)
12 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
15 STORE_FAST 1 (x)

4 18 LOAD_FAST 1 (x)
21 RETURN_VALUE
>>> dis.dis(g)
2 0 LOAD_CONST 1 ('foo')
3 LOAD_ATTR 0 (lower)
6 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
9 STORE_FAST 0 (x)

3 12 LOAD_FAST 0 (x)
15 RETURN_VALUE
>>>

(令人遗憾的是,CPython 仍然在字节编译时甚至不执行基本的 CSE 或 copyprop,但这完全是另一个问题。)

在第一种情况下,运行时内存需求也略大,因为函数有两个变量槽而不是一个,但字符串本身不会额外复制一次。 Python 始终对所有内容使用引用语义。

编辑: 正如 cdonts 指出的那样,如果代码更复杂并且变量不会立即超出范围,第一个版本将原始字符串保留在堆中,直到 s 确实超出了范围,这 可能会产生显着的额外内存开销。我什至没有想到这一点。

关于Python:分配变量和调用方法的内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25023050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com