考虑下面在IDLE和Python3中运行的代码:
np.ones((1000,1000,1000), dtype=np.float64)
def func1(b):
b = np.ones((1000,1000,1000), dtype=np.float32)
def func2(b):
b = np.ones((1000,1000,1000), dtype=np.float32)
return b
调用func1(a)
会导致短暂的内存高峰,垃圾回收器会立即释放它,但是调用func2(a)
将立即高峰内存并保留在那里(直到显式调用gc.collect()
为止),即使返回值不是分配给任何变量。我没有其他参考该值的地方。
使这个更简单:
def func1():
b = np.ones((1000,1000,1000), dtype=np.float32)
def func2():
b = np.ones((1000,1000,1000), dtype=np.float32)
return b
def func3():
return np.ones((1000,1000,1000), dtype=np.float32)
然后调用func1()
与上一场景相同,即增加内存并立即释放它。同时调用func2()
和func3()
似乎没有任何反应。
幕后发生了什么事情来解释这种内存分配行为? return
语句如何影响分配?
您提到您正在IDLE中运行。
交互式会话将对最后返回的值的引用保存在_
变量中,这意味着您的numpy数组具有引用计数,因此无法立即对其进行收集。删除builtins._
将释放内存。
请参阅sys.displayhook
文档以获取更多信息。