【问题标题】:Why can using __slots__ make attribute access faster? [duplicate]为什么使用 __slots__ 可以使属性访问更快? [复制]
【发布时间】:2017-05-24 17:30:25
【问题描述】:

这个问题:Usage of __slots__? 回答__slots__ 可以使属性访问更快。但我想知道为什么?

当我们在一个类中定义__slots__ 会发生什么?

【问题讨论】:

  • __slots__ 是一项优化功能,它取消了 __dict__ 字典 - 因此进行了优化。它有许多缺点。它必须“手动”构建和维护,而__dict__ 是动态的。其次,继承的类也必须使用它,否则它们可能会更慢。第三,它破坏了期望有__dict__的代码。

标签: python slots


【解决方案1】:

至于为什么 访问更快 Guido talks about it here:

特别是,为了使数据描述符正常工作,任何 对对象属性的操作首先涉及检查 类字典以查看该属性是否实际上是数据 描述符。如果是这样,描述符用于处理属性 访问而不是按原样手动操作实例字典 通常情况下。然而,这个额外的检查也意味着额外的 将在检查每个字典之前执行查找 实例。因此使用__slots__ 是优化查找的一种方式 数据属性——一个后备,如果你愿意的话,以防人们 对新类系统的性能影响感到失望。

【讨论】:

    【解决方案2】:

    来自文档 (slots):

    默认情况下,旧式和新式类的实例都有一个用于属性存储的字典。这浪费了具有很少实例变量的对象的空间。创建大量实例时,空间消耗会变得非常严重。

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

    使用__slots__ 可以优化内存和性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      相关资源
      最近更新 更多