我使用python 2.7.7运行以下代码:
import gc
import memory_profiler
print memory_profiler.memory_usage()[0]
x = [i for i in range(10000000)]
print memory_profiler.memory_usage()[0]
x = None
print memory_profiler.memory_usage()[0]
gc.collect()
print memory_profiler.memory_usage()[0]
它产生了以下输出:
11.36328125
321.9140625
245.6171875
245.6171875
这里发生了什么?是什么解释了内存使用量减少了约25%?
答案 0 :(得分:1)
这个post应该给你一个很好的主意。基本上,python将有一些空闲列表内存,当它们用完时,内存就会开销。例如:
import gc
import memory_profiler
print memory_profiler.memory_usage()[0]
x = [i for i in range(10000)]
print memory_profiler.memory_usage()[0]
x = None
print memory_profiler.memory_usage()[0]
gc.collect()
print memory_profiler.memory_usage()[0]
输出:
7.28515625
7.796875
7.796875
7.796875
但是当我使用一个非常庞大的列表运行你的代码时,结果是不同的,代码:
import gc
import memory_profiler
print memory_profiler.memory_usage()[0]
x = [i for i in range(10000000)]
print memory_profiler.memory_usage()[0]
x = None
print memory_profiler.memory_usage()[0]
gc.collect()
print memory_profiler.memory_usage()[0]
输出:
7.3515625
387.31640625
311.30859375
94.7890625
所以如果我说的一切都是真的,如果它在吃完免费的python列表内存之后真的造成了开销;让我们尝试释放类似于post的内存:
import gc
import memory_profiler
def release_list(a):
del a[:]
del a
print memory_profiler.memory_usage()[0]
x = [i for i in range(10000000)]
release_list(x)
print memory_profiler.memory_usage()[0]
x = None
print memory_profiler.memory_usage()[0]
gc.collect()
print memory_profiler.memory_usage()[0]
输出:
7.34765625
318.3359375
318.3359375
96.3359375
显然,当你指定x = None时,它会释放你用真正大的列表发起的额外负担。通常在现实世界中,python空闲列表内存应该满足用户的要求,并没有任何区别。
其他资源: