【发布时间】:2017-12-20 18:02:02
【问题描述】:
我在元组/列表中存储了大量复杂数据,但更喜欢使用小型包装类来使数据结构更易于理解,例如
class Person:
def __init__(self, first, last):
self.first = first
self.last = last
p = Person('foo', 'bar')
print(p.last)
...
会比
p = ['foo', 'bar']
print(p[1])
...
然而似乎存在可怕的内存开销:
l = [Person('foo', 'bar') for i in range(10000000)]
# ipython now taks 1.7 GB RAM
和
del l
l = [('foo', 'bar') for i in range(10000000)]
# now just 118 MB RAM
为什么?有没有我没有想到的明显替代解决方案?
谢谢!
(我知道,在这个例子中,'wrapper' 类看起来很傻。但是当数据变得更复杂和嵌套时,它会更有用)
【问题讨论】:
-
collections.namedtuple似乎是为此目的而设计的,但它们以1.1GB为例。也好不了多少。 -
查看
__slots__或将key-sharing dictionary 移至Python 3。 -
在元组的情况下,我相信它只是引用同一个元组 1000 万次。当您创建一个对象时,无论是类还是新元组,它都会使用更多的内存
-
如答案所示,您的元组示例仅创建一个元组对象。您应该创建一个测试用例,在其中创建许多 不同 元组与自定义对象,看看性能如何。
-
尝试随机化这些值,你应该会得到不同的结果。
标签: python list class data-structures tuples