我有一个 python 代码,其中内存消耗随着时间的推移而稳步增长。虽然有几个对象可以合法地增长得相当大,但我试图了解我观察到的内存占用是否是由于这些对象造成的,还是只是我在内存中乱扔了没有得到正确处理的临时对象--- 作为最近从手动内存管理世界转变过来的人,我想我只是不完全了解 python 运行时如何处理临时对象的一些非常基本的方面。
考虑一个大致具有这种一般结构的代码(我省略了不相关的细节):
def tweak_list(lst):
new_lst = copy.deepcopy(lst)
if numpy.random.rand() > 0.5:
new_lst[0] += 1 # in real code, the operation is a little more sensible :-)
return new_lst
else:
return lst
lst = [1, 2, 3]
cache = {}
# main loop
for step in xrange(some_large_number):
lst = tweak_list(lst) # <<-----(1)
# do something with lst here, cut out for clarity
cache[tuple(lst)] = 42 # <<-----(2)
if step%chunk_size == 0:
# dump the cache dict to a DB, free the memory (?)
cache = {} # <<-----(3)
问题:
new_list
在 a 中创建的 a的生命周期是tweak_list
多少?它会在退出时被销毁,还是会被垃圾收集(此时?)。是否会反复调用tweak_list
生成大量的小列表而长时间徘徊?list
将 a 转换为 atuple
以用作dict
密钥时是否有临时创建?- 将a设置
dict
为空会释放内存吗? - 或者,我是从一个完全错误的角度来处理手头的问题吗?