用gc和memory_profiler进行python实验

时间:2016-05-06 15:17:31

标签: python garbage-collection

我使用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%?

1 个答案:

答案 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空闲列表内存应该满足用户的要求,并没有任何区别。

其他资源:

  1. http://deeplearning.net/software/theano/tutorial/python-memory-management.html

  2. What is the value of None in memory?