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

时间:2018-10-28 21:27:50

标签: python memory memory-management

这分为两个问题。我也确实想排除这些问题是出于好奇。

问题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
节点存储在堆或堆栈内存中,为什么?我本人试图对此进行推理,但是我发现自己在两个答案之间跳来跳去。

1 个答案:

答案 0 :(得分:0)

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

from pympler import asizeof

...

bag = DoublyLinkedBag()

for i in range(100):
    print(asizeof.asizeof(bag))
    bag.add(i)