Python 创建进入函数的变量时的内存管理
Python memory management when creating variables that go into functions
我有两个数组 A
和 B
,它们的大小为 (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)])
我认为第一种情况使用更多内存,因为它节省了 L1
和 L2
。 This reddit 线程讨论了重命名变量,但这是一个稍微不同的情况(或者可能不是)。垃圾收集器会在这里检测到 L1
和 L2
不再被使用,因此它会删除它们吗?如果代码是 运行 in IPython(而不是 shell),其中可以访问变量怎么办?这种情况会有所不同吗?
在第一个版本中,由 np.power()
和 np.abs()
创建的数组将保留在内存中直到脚本结束,因为变量防止它们成为垃圾。
在第二个版本中,数组将在函数 returns 时被垃圾回收,因为它们只分配给函数参数,当函数退出时这些参数就会消失。所以这个版本会占用更少的内存。
如果在函数调用中使用变量后重新分配或删除变量,则可以使第一个版本与第二个版本相同。
我有两个数组 A
和 B
,它们的大小为 (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)])
我认为第一种情况使用更多内存,因为它节省了 L1
和 L2
。 This reddit 线程讨论了重命名变量,但这是一个稍微不同的情况(或者可能不是)。垃圾收集器会在这里检测到 L1
和 L2
不再被使用,因此它会删除它们吗?如果代码是 运行 in IPython(而不是 shell),其中可以访问变量怎么办?这种情况会有所不同吗?
在第一个版本中,由 np.power()
和 np.abs()
创建的数组将保留在内存中直到脚本结束,因为变量防止它们成为垃圾。
在第二个版本中,数组将在函数 returns 时被垃圾回收,因为它们只分配给函数参数,当函数退出时这些参数就会消失。所以这个版本会占用更少的内存。
如果在函数调用中使用变量后重新分配或删除变量,则可以使第一个版本与第二个版本相同。