gpt4 book ai didi

python - Python LinkedList 中的错误内存分配

转载 作者:太空狗 更新时间:2023-10-30 01:38:28 27 4
gpt4 key购买 nike

我有一些关于 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 的 RAM

输出是:

elem.size =  12 
next.size = 8
size of r: 40000028
size of r[n-1]: 12

所以,让我们快速算一下:

1000万条记录。

每个记录有 12 个字节(elem)+ 8 个字节(指向下一个的指针)= 20 个字节

20 字节 * 1000 万 = 200.000.000 字节 = 190.7 MB

即使我必须考虑由 range() 函数分配的列表(大约 30 MB),我如何管理内存消耗的巨大差距?我在这段代码中犯了一些愚蠢的错误吗?我希望这个答案会让我感到羞愧和抱歉,但我只是想知道发生了什么!

预先感谢您的帮助。

最佳答案

>>> 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

关于python - Python LinkedList 中的错误内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16951103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com