类对象的数据效率

时间:2017-02-18 13:03:14

标签: python

在我看来,特定类的每个实例都有自己的字典。当存在大量相同结构的类对象时,这可能浪费大量空间。实际上是这种情况,还是底层机制更有效,只有在明确要求时才创建对象的字典。 我正在考虑一个应用程序,我可能有一个非常大的数字,可能有数百万的对象,我应该避免使用一个类,而是使用一个命名常量的序列作为索引?

2 个答案:

答案 0 :(得分:1)

如果您想减少开销,您可以根据实际需要选择两个选项。

如果您需要类似于类的结构,那么您应该考虑使用__slots__。这将避免__dict__,但仍允许您拥有方法,属性等。您将无法动态添加属性(您仅限于__slots__列出的属性)。

如果你只想要一个"存储"对于对象而言,不需要方法和类似物,您可以使用collections.namedtuple。这些提供类似"类#34;与他们的物品接口,应该是非常节省空间。

例如,一个只有两个属性的类" lastname"和"名字"可以实现为:

class Person(object):
    __slots__ = ['firstname', 'lastname']

    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname

    def __repr__(self):
        return '{self.__class__.__name__}({self.firstname!r}, {self.lastname!r})'.format(self=self)

>>> p = Person('Tom', 'Riddle')
>>> p
Person('Tom', 'Riddle')
>>> p.firstname
'Tom'

或作为namedtuple:

>>> from collections import namedtuple

>>> Person = namedtuple('Person', 'firstname, lastname')

>>> p = Person('Tom', 'Riddle')
>>> p
Person(firstname='Tom', lastname='Riddle')
>>> p.firstname
'Tom'

答案 1 :(得分:-1)

这取决于您要存储在每个对象中的数据,但在大多数情况下,列表应该这样做。