2017-01-10 76 views
3

此问题:Usage of __slots__?答案__slots__可以使属性访问速度更快。但我想知道为什么?为什么使用__slots__可以使属性访问更快?

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

+1

http://stackoverflow.com/questions/14118564/how-does-slots-avoid-a-dictionary-lookup – DavidW

+0

'__slots__'是一种优化功能,它与'__dict__'字典摒弃 - 因此优化。 它有许多缺点。它必须“手动”构建和维护,而__dict__是动态的。其次,继承类必须使用它,否则它们可能会变慢。第三,它破坏了预计会有'__dict__'的代码。 – cdarke

回答

1

从技术文档(slots):

默认情况下,新老风格的类的实例有一个字典属性存储。这浪费了具有很少实例变量的对象的空间。创建大量实例时,空间消耗可能会变得尖锐。

默认值可以通过在新样式类定义中定义插槽来覆盖。 插槽声明需要一系列实例变量,并在每个实例中保留足够的空间以保存每个变量的值。空间被保存,因为字典不是为每个实例创建的。

使用插槽给出内存和性能优化。

3

至于为什么访问更快圭多talks about it here

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

相关问题