gpt4 book ai didi

python - __slots__ 如何避免字典查找?

转载 作者:太空狗 更新时间:2023-10-29 17:27:29 24 4
gpt4 key购买 nike

我听说 __slots__ 通过避免字典查找使对象更快。我的困惑来自于 Python 是一种动态语言。在静态语言中,我们通过编译时优化将索引保存在我们运行的指令中,从而避免了对 a.test 的字典查找。

现在,在 Python 中,a 可以很容易地成为另一个具有字典或一组不同属性的对象。看起来我们仍然需要进行字典查找 - 唯一的区别似乎是我们只需要一个类字典,而不是每个对象一个字典。

有了这个理性,

  1. __slots__ 如何避免字典查找?
  2. 槽是否使访问对象更快?

最佳答案

__slots__ 不会(显着)加速属性访问:

>>> class Foo(object):
... __slots__ = ('spam',)
... def __init__(self):
... self.spam = 'eggs'
...
>>> class Bar(object):
... def __init__(self):
... self.spam = 'eggs'
...
>>> import timeit
>>> timeit.timeit('t.spam', 'from __main__ import Foo; t=Foo()')
0.07030296325683594
>>> timeit.timeit('t.spam', 'from __main__ import Bar; t=Bar()')
0.07646608352661133

使用__slots__ 的目的是节省内存;而不是在实例上使用 .__dict__ 映射,该类具有 descriptors objects对于 __slots__ 中命名的每个属性和实例都分配了属性无论是否它们都有一个实际值:

>>> class Foo(object):
... __slots__ = ('spam',)
...
>>> dir(Foo())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'spam']
>>> Foo().spam
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: spam
>>> Foo.spam
<member 'spam' of 'Foo' objects>
>>> type(Foo.spam)
<type 'member_descriptor'>

因此 python 仍然必须查看类以访问 Foo 实例上的每个属性(以找到描述符)。任何未知属性(例如,Foo.ham)仍然会导致 Python 通过类 MRO 来搜索该属性,这包括字典搜索。您仍然可以为分配额外的属性:

>>> Foo.ham = 'eggs'
>>> dir(Foo)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'ham', 'spam']
>>> Foo().ham
'eggs'

槽描述符在创建类时创建,并访问分配给每个实例的内存以存储和检索对关联值的引用(同一 block 内存跟踪实例引用计数和返回类对象的引用).如果没有插槽,则使用 __dict__ 的描述符以相同的方式访问对 dict 对象的引用。

关于python - __slots__ 如何避免字典查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14118564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com