我必须在Python中实现二叉树。树的一个节点具有多个属性。我的一个要求是最少的内存使用量,特别是数据结构的开销。
所以我的问题是,通过不同的实现方式产生了多少开销。我想考虑使用一个字典,其中一个键是“左”,另一个键是“右”的子节点。另一种方法是使用具有“左”和“右”属性的类为子项。
这两种选择有任何明显的优点或缺点吗?或者有更好的选择吗?
我将不得不使用Pythons标准库,而我正在使用Python 3.5。
答案 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来实现你的代码来考虑记忆限制。