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

标签 python memory

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

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/

相关文章:

memory - Rust 如何在数组中存储枚举值?

firefox - 如何测量 Firefox 附加内存使用情况

java - 使用显示 :table jSTL tag 的内存使用问题

python - 使用 Tensorflow 2.0 进行逻辑回归?

c - 是否有一种方式可以一点一点地修改 vector/数组的元素?

python - ValueError : Shapes must be equal rank, 但是是 1 和 0 来自将形状 1 与其他形状合并。对于 'loss/AddN'

python - 使每次调用函数时计算 Python 函数默认值

performance - 在 Julia 中分解一个没有任何内存分配的矩阵

python - Pandas Xlsxwriter 时间格式

python - 使用正则表达式获取所需行的问题