【发布时间】:2017-05-24 17:30:25
【问题描述】:
【问题讨论】:
-
__slots__是一项优化功能,它取消了__dict__字典 - 因此进行了优化。它有许多缺点。它必须“手动”构建和维护,而__dict__是动态的。其次,继承的类也必须使用它,否则它们可能会更慢。第三,它破坏了期望有__dict__的代码。
【问题讨论】:
__slots__ 是一项优化功能,它取消了 __dict__ 字典 - 因此进行了优化。它有许多缺点。它必须“手动”构建和维护,而__dict__ 是动态的。其次,继承的类也必须使用它,否则它们可能会更慢。第三,它破坏了期望有__dict__的代码。
至于为什么 访问更快 Guido talks about it here:
特别是,为了使数据描述符正常工作,任何 对对象属性的操作首先涉及检查 类字典以查看该属性是否实际上是数据 描述符。如果是这样,描述符用于处理属性 访问而不是按原样手动操作实例字典 通常情况下。然而,这个额外的检查也意味着额外的 将在检查每个字典之前执行查找 实例。因此使用
__slots__是优化查找的一种方式 数据属性——一个后备,如果你愿意的话,以防人们 对新类系统的性能影响感到失望。
【讨论】:
来自文档 (slots):
默认情况下,旧式和新式类的实例都有一个用于属性存储的字典。这浪费了具有很少实例变量的对象的空间。创建大量实例时,空间消耗会变得非常严重。
可以通过在新样式类定义中定义
__slots__来覆盖默认值。__slots__声明采用一系列实例变量,并在每个实例中保留足够的空间来保存每个变量的值。节省空间是因为__dict__不是为每个实例创建的。
使用__slots__ 可以优化内存和性能。
【讨论】: