基于Python节点的集合内存分配



这分为两个问题。我还想指出,这些问题完全是出于好奇。

问题1
检索基于节点的集合的内存的方法是什么?即,一个节点链占用了多少内存?如果你想找到列表占用的内存量,你可以使用:

import sys
sys.getsizeof([])

当我在我的集合类(见下文(sys.getsizeof(DoublyLinkedBag())上使用相同的命令时,它会给我一个值56。但是,当我添加一个节点并运行相同的命令时,我会得到相同的数字。我假设这是因为我得到的是类实例的分配,而不是节点链的分配。

我也试过做sys.getsizeof(node.add(3))。脱离上述假设,我会把它给我的值乘以节点链的大小加上sys.getsizeof(DoublyLinkedBag())给我的数值吗?

关联的双链接类:

class DoublyLinkedBag:
class Node:
def __init__(self, element = None):
self.next = None
self.prev = None
self.element = element
def __init__(self):
self.front = None
self.rear = None
self.size = 0
def add(self, element):
n = self._make_new_node(element)
if self.size == 0:
self.front = self.rear = n
self.size += 1
else:
n.prev = self.rear
self.rear.next = self.rear = n
self.size += 1
# contains, removes methods here...
# add nodes
node = DoublyLinkedBag()
node.add(4)
node.add(6)

问题2
节点是否存储在堆或堆栈内存中,为什么?我试着自己推理,但我发现自己在两个答案之间跳来跳去。

要计算内存分配,我建议尝试使用pympler-lib中的asizeof。

from pympler import asizeof
...
bag = DoublyLinkedBag()
for i in range(100):
print(asizeof.asizeof(bag))
bag.add(i)

最新更新