2017-02-18 2 views
0

Мне кажется, что каждый экземпляр определенного класса имеет свой собственный словарь. Это может растратить много места, когда имеется большое количество одинаково структурированных объектов класса. Это на самом деле то, или основной механизм более эффективен, только создавая словарь объекта, когда он явно запрашивается. Я рассматриваю приложение, в котором у меня может быть очень много, возможно, в миллионы объектов, следует ли мне избегать использования класса и вместо этого использовать последовательность с именованной константой в качестве индекса?Эффективность данных объектов класса

+1

Миллионы не очень большое количество, но вы должны проверить '__slots__'. Например, здесь: http://stackoverflow.com/questions/472000/usage-of-slots –

+0

@Paul Hankin. Это должен был быть ответ, тогда я мог бы его поддержать. Это именно тот ответ, который я искал. –

+0

Имеет дополнительное преимущество, к которому можно получить доступ только элементы, названные в переменной __slots__, поэтому ошибки ввода будут обнаружены раньше. Это действительно должно быть гораздо более заметным в документации Python. –

ответ

1

Если вы хотите уменьшить накладные расходы, у вас есть два варианта в зависимости от того, что вам действительно нужно.

Если вам нужна классная структура, вам следует рассмотреть возможность использования __slots__. Это позволит избежать __dict__, но все же позволяет вам иметь методы, свойства и т. Д. Вы потеряете возможность динамически добавлять атрибуты (вы ограничены теми, которые перечислены как __slots__).

Если вы просто хотите «хранить» для объектов и не нуждаетесь в методах и аналогичных, вы можете использовать collections.namedtuple. Они обеспечивают «классный» интерфейс для своих элементов и должны быть достаточно экономичными в пространстве.

Например, класс, который только имеет два атрибута «LastName» и «FirstName» может быть реализована как:

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' 
+0

Предотвращение динамического добавления членов, на мой взгляд, чаще всего является преимуществом. Я не знал о namedtuple и в противном случае считал бы это хорошим решением, но __slots__ кажется превосходным. –

+0

@ChrisBarry Оба имеют свои прецеденты. Я согласен с тем, что '__slots__' превосходен (они позволяют использовать методы и реальные свойства), но в некоторых случаях вам просто нужен контейнер с неизменным контейнером, а затем' namedtuple' является жизнеспособной альтернативой. – MSeifert

-1

Это зависит от данных, которые вы хотите сохранить в каждом объекте, но в большинстве случаев списки должны делать.

Смежные вопросы