我肯定会在这里使用字典。重复使用firstname
实例变量作为字典键不会复制它——字典只会使用相同的对象。我怀疑字典会比集合使用更多的内存。
要真正节省内存,请添加__slots__
归因于你的班级。这将防止 10,000,000 个实例中的每一个实例出现__dict__
属性,这将比一个潜在的开销节省更多的内存dict
over a set
.
Edit:一些数字支持我的主张。我定义了一个愚蠢的示例类,存储随机字符串对:
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__
.