我对Python简单链表及其内存消耗有一些问题。
这是代码:
import sys
class Record:
def __init__(self,elem):
self.elem=elem
self.next=None
def size(self):
print 'elem.size = ', sys.getsizeof(self.elem)
print 'next.size = ', sys.getsizeof(self.next)
class LinkedList:
def __init__(self):
self.first=None
self.last=None
def addAsLast(self,elem):
rec=Record(elem)
if self.first==None:
self.first=self.last=rec
else:
self.last.next=rec
self.last=rec
if __name__=="__main__":
l=LinkedList()
r = Record(1)
r.size()
maxx = 10000000
r = range(1, maxx)
print 'size of r: ', sys.getsizeof(r)
print 'size of r[n-1]: ', sys.getsizeof(r[maxx-2])
for i in r:
if(i% (maxx/10) == 0): print '.'
l.addAsLast(i)
print "The End"
我的问题是:运行此脚本会消耗 1.7 GB的内存。
输出是:
elem.size = 12
next.size = 8
size of r: 40000028
size of r[n-1]: 12
所以,让我们做一些快速的数学运算:
1000万记录。
每个记录有12个字节(elem)+ 8个字节(指向下一个字节)= 20个字节
20字节* 10百万= 200.000.000字节= 190.7 MB
即使我必须考虑range()函数分配的列表(大约30 MB),如何管理内存消耗的巨大差距?我在这段代码中做过一些愚蠢的错误吗?我希望答案会让我感到惭愧和抱歉,但是,我知道,我只是想知道发生了什么!
提前感谢您的帮助。
答案 0 :(得分:0)
>>> class Record:
... def __init__(self, elem):
... self.elem = elem
... self.next = None
...
>>> r = Record(1)
>>> sys.getsizeof(r)
72
或者我错过了什么?
另外,在我的系统上:
>>> sys.getsizeof(1)
24
>>> sys.getsizeof(None)
16
答案 1 :(得分:0)
更改打印输出如下:
class Record:
def __init__(self,elem):
self.elem=elem
self.next=None
def size(self):
print 'Record size = ', sys.getsizeof(self)
print 'elem.size = ', sys.getsizeof(self.elem)
print 'next.size = ', sys.getsizeof(self.next)
输出:
Record size = 72
elem.size = 24
next.size = 16
因此,我的每个链表节点都是72字节x 10M应该是720MB,。72GB
我运行程序,使用top,看到内存开销是3.6G。 我的elem大小是你的两倍,我注意到你消耗的总内存的两倍(3.6G,相比1.7G)。
这必须是由于额外的python内存开销,例如垃圾收集。