Python中的二进制树

时间:2017-03-24 08:47:06

标签: python class dictionary memory binary-tree

我必须在Python中实现二叉树。树的一个节点具有多个属性。我的一个要求是最少的内存使用量,特别是数据结构的开销。

所以我的问题是,通过不同的实现方式产生了多少开销。我想考虑使用一个字典,其中一个键是“左”,另一个键是“右”的子节点。另一种方法是使用具有“左”和“右”属性的类为子项。

这两种选择有任何明显的优点或缺点吗?或者有更好的选择吗?

我将不得不使用Pythons标准库,而我正在使用Python 3.5。

2 个答案:

答案 0 :(得分:2)

Python dicts很重,记忆力很强。如果您利用__slots__,那么不需要动态属性的类可以比较轻量级:

  

默认情况下,类的实例具有属性的字典   存储。这浪费了实例很少的对象的空间   变量。创建大型空间时,空间消耗可能会变得严重   实例数。

     

可以通过在类中定义__slots__来覆盖默认值   定义。 __slots__声明采用一系列实例   变量和保留每个实例中足够的空间来容纳一个   每个变量的值。空间已保存,因为__dict__不是   为每个实例创建。

考虑:

In [1]: class Node(object):
   ...:     __slots__ = ('left', 'right','data')
   ...:     def __init__(self, left, right, data):
   ...:         self.left = left
   ...:         self.right = right
   ...:         self.data = data
   ...:

In [2]: n = Node(None, None, None)

In [3]: d = {}

In [4]: import sys

In [5]: sys.getsizeof(n)
Out[5]: 64

In [6]: sys.getsizeof(d)
Out[6]: 288

答案 1 :(得分:1)

我认为您可以使用class,dictionary和namedtuple来实现它。

如果你想使用class:

class BNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

import sys
b = BNode(5)
sys.getsizeof(b)

这将在我的电脑上使用python 3.5.2返回56。 如果我们想要优化它,我们添加__slot__ atrribute。

class BNode(object):
    __slot__ = ('val','left','right')
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

b = BNode(5)

这也将在我的电脑上返回56.

如果你想使用字典:

node_dict = {'left':None, 'right':None, 'val':5}
sys.getsizeof(node_dict)

这将在我的电脑上返回288。

还有另一种选择:使用namedtuple

from collections import namedtuple
BNode = namedtuple('BNode', ['val','left','right'])
b = BNode(5, None, None)
sys.getsizeof(b)

这将在我的电脑上返回76.

根据上面的代码,我认为我们应该使用__slot__和class来实现你的代码来考虑记忆限制。