栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

__slots__如何避免字典查找?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

__slots__如何避免字典查找?

__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__
该类没有在实例上使用映射,而是为每个在中命名的属性都有描述符对象,
__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().spamTraceback (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'

插槽描述符是在创建类时创建的,并访问分配给每个实例的内存,以存储和检索对关联值的引用(跟踪实例引用计数和对类对象的引用的同一块内存)。如果没有插槽,

__dict__
则使用的描述符以
dict
相同的方式访问对对象的引用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/652655.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号