python清除列表占用内存_对象的Python列表占用了太多内存

我有以下代码,它创建了类foo的一百万个对象:

for i in range(1000000):

bar = foo()

list_bar.append(bar)

bar对象只有96个字节,由getsizeof()确定.然而,追加步骤需要几乎8GB的内存.一旦代码退出循环,ram使用量就会下降到预期的数量(列表的大小有些开销~103MB).只有在循环运行时,ram使用才会飙升.为什么会这样?任何解决方法?

PS:使用生成器不是一个选项,它必须是一个列表.

编辑:xrange没有帮助,使用Python 3.内存使用率仅在循环执行期间保持高水平,并在循环结束后下降.可以追加有一些非明显的开销吗?

解决方法:

很可能这是由于foo()构造函数做出的一些无意的循环引用;因为通常Python对象会在引用计数降至零时立即释放内存;现在,当垃圾收集器有机会运行时,这些将被释放.

您可以尝试在10000次迭代后强制运行GC以查看它是否保持内存使用量不变.

import gc

n = 1000000

list_bar = [ None ] * n

for i in range(n):

list_bar[i] = foo()

if i % 10000 == 0:

gc.collect()

如果这样可以减轻内存压力,那么内存使用量就是因为某些参考周期.

调整列表的大小有一些开销.如果您知道有多少元素,那么您可以事先创建列表,例如:

list_bar = [ foo() for _ in xrange(1000000) ]

应该知道数组的大小而不需要调整它的大小;或创建填充无的列表:

n = 1000000

list_bar = [ None ] * n

for i in range(n):

list_bar[i] = foo()

append应该使用realloc来扩展列表,但旧的内存应该尽快释放;并且所有分配的所有内存的开销都不应该总和到8G,最后是100 MB的列表;操作系统可能错误地计算了所使用的内存.

标签:python,memory,python-3-x,list

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值