【问题标题】:Why does the python __slots__ not saving memory? [duplicate]为什么 python __slots__ 不节省内存? [复制]
【发布时间】:2016-08-29 08:22:37
【问题描述】:
class Player:
    # __slots__ = ['name','age','gsnum']
    def __init__(self,name,age,gsnum):
        self.name = name
        self.age = age
        self.gsnum = gsnum

我定义了这个类,具有三个属性

使用__slots__节省内存时:

我得到 36 个实例 (sys.getsizeof()) 如果不使用__slots__, 我仍然得到 36 作为内存大小,

这里有什么问题? 32位Python 2.7

【问题讨论】:

  • 您好像注释掉了 slot 声明。
  • 在我的机器上使用__slots__ 作为这个例子增加内存使用。
  • 内存真的有问题吗?请注意,由于引入 PEP 412 实例的 python3.3 能够共享其dicts 的一部分,因此每个实例的dicts 开销显着减少。
  • @Bakuriu 谢谢,我不知道。嗯,我只是想起来了,我也觉得没什么大不了,但结果却相反

标签: python python-2.7 slots


【解决方案1】:

Python Documentation 声明:

可以通过在新样式类定义中定义__slots__ 来覆盖默认值。 __slots__ 声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为 __dict__ 不是为每个实例创建的。

强调我的。

这意味着您的类定义必须如下所示:

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

【讨论】:

  • +1 -- 很好的收获。我没有意识到 OP 使用的是过时的 python 版本并且忘记从object 继承。顺便说一句:似乎__slots__ 仅使用单个属性减少内存。
  • 为什么要使用对象?您可以在使用对象时测试大小,更大
  • @EricWang 'New Style' python 类定义必须从 object 继承,除非使用 python 3,默认情况下它们是新的。 __slots__ 仅适用于作为文档状态的新样式类。
  • 好的。谢谢。但为什么会出现相反的结果?
  • @EricWang:sys.getsizeof 很浅。如果它们是单独的对象,它不会报告您可能认为是对象“一部分”的对象占用的内存。例如,它不计算 __dict____dict__ 所指的任何内容的大小。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
相关资源
最近更新 更多