我正在一個項目中,該項目涉及從保存在內存中的大列表訪問數據。因為該列表非常龐大(數百萬行),所以我一直在關注正在使用的內存量。我使用OS X,因此在創(chuàng)建這些列表時我將“活動監(jiān)視器”保持打開狀態(tài)。我注意到,列表使用的內存量可能會因其構造方式而有很大差異,但我似乎無法弄清楚原因?,F(xiàn)在來看一些示例代碼:(我在OSX 10.8.3上使用Python 2.7.4)下面的第一個函數創(chuàng)建一個列表,并用所有相同的三個隨機數填充它。下面的第二個函數創(chuàng)建一個列表,并用所有不同的隨機數填充它。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(首先讓我說,我意識到上面的代碼可以更有效地編寫。這種編寫方式是為了使兩個示例盡可能相似。)現(xiàn)在,我使用這些功能創(chuàng)建一些列表:In [2]: thing1 = make_table1(6000000)In [3]: sys.getsizeof(thing1)Out[3]: 48000072在這一點上,我使用的內存大約增加了46 MB,這是我從上面給出的信息中所期望的?,F(xiàn)在為下一個功能:In [4]: thing2 = make_table2(6000000)In [5]: sys.getsizeof(thing2)Out[5]: 48000072如您所見,兩個列表占用的內存是相同的。它們的長度完全相同,這是可以預期的。我沒想到的是,活動監(jiān)視器提供的內存已躍升到1 GB以上!我知道會有一些開銷,但會是20倍嗎?1 GB的46MB列表?嚴重地?
1 回答

紫衣仙女
TA貢獻1839條經驗 獲得超15個贊
這兩個函數都列出了6000000個引用。
sizeof(thelist) ? sizeof(reference_to_a_python_object) * 6000000
第一個列表包含對三個浮點數的相同一個元組的6000000個引用。
第二個列表包含對600萬個不同元組的引用,這些元組包含18000000個不同的浮點數。
如您所見,float占用24個字節(jié),triple占用80個字節(jié)(使用python構建)。不,除了numpy之外沒有其他方法。
要將列表變成可收集的垃圾,您需要刪除對它們的任何引用:
del thing1 del thing2
添加回答
舉報
0/150
提交
取消