[英]Binary Trees in Python
我必须在Python中实现二叉树。 树的一个节点具有多个属性。 我的一个要求是最小的内存使用量,特别是数据结构的开销。
所以我的问题是,通过不同的实现方式产生了多少开销。 我想考虑使用一个字典,其中一个键是“左”,另一个键是“右”的子节点。 另一种方法是使用具有“左”和“右”属性的类为子项。
这两种选择有任何显着的优点或缺点吗? 或者有更好的选择吗?
我将不得不使用Pythons标准库,而我正在使用Python 3.5。
Python dicts
很重,记忆力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
我认为你可以使用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返回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来实现你的代码来考虑记忆限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.