为了账号安全,请及时绑定邮箱和手机立即绑定

Python列表异常内存使用情况

Python列表异常内存使用情况

明月笑刀无情 2021-03-21 21:19:39
我正在一个项目中,该项目涉及从保存在内存中的大列表访问数据。因为该列表非常庞大(数百万行),所以我一直在关注正在使用的内存量。我使用OS X,因此在创建这些列表时我将“活动监视器”保持打开状态。我注意到,列表使用的内存量可能会因其构造方式而有很大差异,但我似乎无法弄清楚原因。现在来看一些示例代码:(我在OSX 10.8.3上使用Python 2.7.4)下面的第一个函数创建一个列表,并用所有相同的三个随机数填充它。下面的第二个函数创建一个列表,并用所有不同的随机数填充它。import randomimport sysdef make_table1(size):    list1 = size *[(float(),float(),float())] # initialize the list    line = (random.random(),             random.random(),             random.random())    for count in xrange(0, size): # Now fill it        list1[count] = line    return list1def make_table2(size):    list1 = size *[(float(),float(),float())] # initialize the list    for count in xrange(0, size): # Now fill it        list1[count] = (random.random(),                         random.random(),                         random.random())    return list1(首先让我说,我意识到上面的代码可以更有效地编写。这种编写方式是为了使两个示例尽可能相似。)现在,我使用这些功能创建一些列表:In [2]: thing1 = make_table1(6000000)In [3]: sys.getsizeof(thing1)Out[3]: 48000072在这一点上,我使用的内存大约增加了46 MB,这是我从上面给出的信息中所期望的。现在为下一个功能:In [4]: thing2 = make_table2(6000000)In [5]: sys.getsizeof(thing2)Out[5]: 48000072如您所见,两个列表占用的内存是相同的。它们的长度完全相同,这是可以预期的。我没想到的是,活动监视器提供的内存已跃升到1 GB以上!我知道会有一些开销,但会是20倍吗?1 GB的46MB列表?严重地?
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

这两个函数都列出了6000000个引用。

sizeof(thelist) ≅ sizeof(reference_to_a_python_object) * 6000000

第一个列表包含对三个浮点数的相同一个元组的6000000个引用。

第二个列表包含对600万个不同元组的引用,这些元组包含18000000个不同的浮点数。

//img1.sycdn.imooc.com//605944bf000142cf05170608.jpg

如您所见,float占用24个字节,triple占用80个字节(使用python构建)。不,除了numpy之外没有其他方法。

要将列表变成可收集的垃圾,您需要删除对它们的任何引用:

del thing1 
del thing2


查看完整回答
反对 回复 2021-03-23
  • 1 回答
  • 0 关注
  • 219 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号