Как вы это измеряете?
Я сделал небольшой тест, который не подтверждает ваши результаты.
Вот источник:
import meminfo, gc, commands
page_size = int(commands.getoutput("getconf PAGESIZE"))
def stat(message):
s = meminfo.proc_stat()
print "My memory usage %s: RSS: %dkb, VSIZE: %dkb" % (
message, s['rss']*page_size/1024, s['vsize']/1024)
mylist = []
stat("before allocating a big list")
for i in range(0,3000000):
mylist.append('something here to take memory')
stat("after allocating big list")
### uncomment one of these:
mylist = []
# del mylist[:]
stat("after dropping a big list")
gc.collect()
stat("after gc.collect()")
gc.collect()
stat("after second gc.collect()")
gc.collect()
stat("after third gc.collect()")
Здесь используется модуль meminfo: http://gist.github.com/276090
Это результаты с mylist = []:
My memory usage before allocating a big list: RSS: 3396kb, VSIZE: 7324kb
My memory usage after allocating big list: RSS: 50700kb, VSIZE: 55084kb
My memory usage after dropping a big list: RSS: 38980kb, VSIZE: 42824kb
My memory usage after gc.collect(): RSS: 38980kb, VSIZE: 42824kb
My memory usage after second gc.collect(): RSS: 38980kb, VSIZE: 42824kb
My memory usage after third gc.collect(): RSS: 38980kb, VSIZE: 42824kb
Это результаты с del mylist [:]:
My memory usage before allocating a big list: RSS: 3392kb, VSIZE: 7324kb
My memory usage after allocating big list: RSS: 50696kb, VSIZE: 55084kb
My memory usage after dropping a big list: RSS: 38976kb, VSIZE: 42824kb
My memory usage after gc.collect(): RSS: 38976kb, VSIZE: 42824kb
My memory usage after second gc.collect(): RSS: 38976kb, VSIZE: 42824kb
My memory usage after third gc.collect(): RSS: 38976kb, VSIZE: 42824kb
Python может выделять память для своей кучи, но он не обязательно освобождает ее сразу после сборки мусора.