Numpy作为参数传递或返回时如何处理内存分配?

问题描述 投票:1回答:1

考虑下面在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()为止),即使返回值不是分配给任何变量。我没有其他参考该值的地方。

enter image description here

使这个更简单:

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语句如何影响分配?

python-3.x numpy memory-management
1个回答
2
投票

您提到您正在IDLE中运行。

交互式会话将对最后返回的值的引用保存在_变量中,这意味着您的numpy数组具有引用计数,因此无法立即对其进行收集。删除builtins._将释放内存。

请参阅sys.displayhook文档以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.