Python中的二叉树

Python中的二叉树,python,class,dictionary,memory,binary-tree,Python,Class,Dictionary,Memory,Binary Tree,我必须用Python实现一个二叉树。树的一个节点具有多个属性。我的要求之一是最低限度的内存使用,特别是数据结构的开销 所以我的问题是,不同的实现方式会产生多少开销。我考虑使用一个字典,其中一个键对于子节点是“left”,另一个键是“right”。另一种方法是为子类使用属性为“left”和“right”的类 这两种选择是否有明显的优点或缺点?还是有更好的选择 我必须使用Pythons标准库,我使用的是python3.5。Pythondicts很重,内存也很丰富。如果您利用以下优势,则不需要动态属性

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

所以我的问题是,不同的实现方式会产生多少开销。我考虑使用一个字典,其中一个键对于子节点是“left”,另一个键是“right”。另一种方法是为子类使用属性为“left”和“right”的类

这两种选择是否有明显的优点或缺点?还是有更好的选择


我必须使用Pythons标准库,我使用的是python3.5。

Python
dicts
很重,内存也很丰富。如果您利用以下优势,则不需要动态属性的类可以相对轻量级:

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

可以通过在类中定义
\uuuuuuuu插槽
来覆盖默认值 定义。
\uuuuuuuuuuuuuuuuuuuuu
声明采用一系列实例 变量,并在每个实例中保留足够的空间来容纳 每个变量的值。由于
\uuuu dict\uuuu
不可用,因此节省了空间 为每个实例创建

考虑:

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

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

如果要使用类:

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的PC上返回56。 如果我们想对其进行优化,我们将添加_uslot _u属性

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


根据上面的代码,我认为我们应该使用带有类的uuu slot uuu来实现您的代码,以考虑内存限制。

@PeterWood如果是这样的话,我很高兴sorry@PeterWood当提到其他网站时,指出要清楚,与
class
dict
相比,
namedtuple
是不可变的。在uuu slot的文档中,描述了属性存储在字典中。但在第一个示例中,节点使用的内存与第二个示例中的节点相同。Python有什么改进吗?插槽总是比字典解决方案好吗?如果是这样的话,为什么还要使用字典呢?@matthias gilch当有很多实例时,内存效率非常高。目前,只有一个实例。