Python 创建进入函数的变量时的内存管理

Python memory management when creating variables that go into functions

我有两个数组 AB,它们的大小为 (10000,100,100)(非常大)。我需要执行一系列操作以将它们传递给其他函数。我的问题是:我怎样才能节省最多的内存?我举个具体的例子。

A = np.random.rand(10000,100,100)
B = np.random.rand(10000,100,100)

def ave_l2_error(diffs):
    for err in diffs:
        print(np.mean(err))

def ave_l1_error(diffs):
    for err in diffs:
        print(np.mean(err))

#Is there a difference in terms of memory usage between doing this:
L2 = [np.power(A-B, 2)]
L1 = [np.abs(A-B)]
ave_l2_error(L2)
ave_l1_error(L1)

#vs this:
ave_l2_error([np.power(A-B, 2)])
ave_l1_error([np.abs(A-B)])

我认为第一种情况使用更多内存,因为它节省了 L1L2This reddit 线程讨论了重命名变量,但这是一个稍微不同的情况(或者可能不是)。垃圾收集器会在这里检测到 L1L2 不再被使用,因此它会删除它们吗?如果代码是 运行 in IPython(而不是 shell),其中可以访问变量怎么办?这种情况会有所不同吗?

在第一个版本中,由 np.power()np.abs() 创建的数组将保留在内存中直到脚本结束,因为变量防止它们成为垃圾。

在第二个版本中,数组将在函数 returns 时被垃圾回收,因为它们只分配给函数参数,当函数退出时这些参数就会消失。所以这个版本会占用更少的内存。

如果在函数调用中使用变量后重新分配或删除变量,则可以使第一个版本与第二个版本相同。