我肯定会在这里用字典。将firstname
实例变量重新用作字典键不会复制它-字典将仅使用同一对象。我怀疑字典将比集合使用更多的内存。
要实际节省内存,__slots__
请在类中添加一个属性。这将防止每次10,000,000实例从具有__dict__
属性,这将节省更多的内存比的潜在开销dict
过set
。
:一些数字来支持我的主张。我定义了一个愚蠢的示例类,存储了成对的随机字符串:
def rand_str():
return str.join("", (chr(random.randrange(97, 123))
for i in range(random.randrange(3, 16))))
class A(object):
def __init__(self):
self.x = rand_str()
self.y = rand_str()
def __hash__(self):
return hash(self.x)
def __eq__(self, other):
return self.x == other.x
一组1,000,000个此类的实例使用的内存量
random.seed(42)
s = set(A() for i in xrange(1000000))
在我的机器上为240 MB。如果我加
__slots__ = ("x", "y")
到该类,这下降到112 MB。如果我在字典中存储相同的数据
def key_value():
a = A()
return a.x, a
random.seed(42)
d = dict(key_value() for i in xrange(1000000))
如果不使用则使用249 MB __slots__
,使用则使用121 MB __slots__
。