2016-05-04 3 views
2
class Player: 
    # __slots__ = ['name','age','gsnum'] 
    def __init__(self,name,age,gsnum): 
     self.name = name 
     self.age = age 
     self.gsnum = gsnum 

Я определил этот класс, с тремя атрибутамиПочему python __slots__ не сохраняет память?

при использовании __slots__ для экономии памяти:

Я получаю 36 для одного экземпляра (sys.getsizeof()) , если не используется __slots__, я все еще получаю 36, как размер памяти,

В чем проблема? 32bit Python 2.7

+0

Похоже, вы прокомментировали объявление слотов. – Kevin

+0

На моей машине с использованием '__slots__' для этого примера * увеличивается использование памяти. – Bakuriu

+0

Является ли память действительно проблемой? Обратите внимание, что поскольку python3.3 с введением экземпляров PEP 412 могут совместно использовать часть своих 'dict', и, таким образом, накладные расходы для' dict's для экземпляра были значительно уменьшены. – Bakuriu

ответ

5

В Python Documentation говорится, что:

по умолчанию можно переопределить путем определения __slots__в определении класса нового стиля. Объявление __slots__ принимает последовательность переменных экземпляра и резервирует достаточно места в каждом экземпляре для хранения значения для каждой переменной. Пробел сохраняется, потому что для каждого экземпляра не создается __dict__.

Emphasis mine.

Что означает ваше определение класса должно выглядеть следующим образом:

class Player(object): 
    __slots__ = ['name','age','gsnum'] 
    def __init__(self,name,age,gsnum): 
     self.name = name 
     self.age = age 
     self.gsnum = gsnum 

Вы можете сказать, если вы получили это право, если вы пытаетесь присвоить переменную, которая не существует в определении слотов. Вы получите AttributeError.

Кстати, с определением класса нового класса класс 32 bytes, но с слотами его 36 bytes в моей системе.

+0

+1 - Хороший улов. Я не понимал, что OP использует устаревшую версию python и забыл наследовать от 'object'. BTW: кажется, что '__slots__' уменьшает память только с помощью одного атрибута. – Bakuriu

+0

Зачем использовать объект? вы можете проверить размер при использовании объекта, гораздо больше –

+0

@EricWang «Новый стиль» Определения класса python должны наследовать от 'object', если не использовать python 3, где они по умолчанию являются новыми. '__slots__' будет работать только с новыми классами стилей в качестве состояния документов. – Serdalis