了解Python中的槽点
为类创建对象需要内存,而存储的属性是以字典的形式存在的。如果我们需要分配数以千计的对象,这将需要大量的内存和索引时间。
槽或__slots__
,提供了一个独特的机制来减少对象的大小和更快的索引。本文将讨论插槽常量变量在Python中如何工作,以及它比使用字典有什么好处。
了解Python中的槽
Slots是一个对对象进行内存优化的概念,将改善我们的Python代码运行时间。例如,当我们从一个类中创建一个自定义对象时,存储在字典中的对象的属性被称为__dict__
。
此外,它允许我们在创建对象后动态地创建新的属性。
如果没有槽,我们的对象就会像下面的片段一样。
示例代码:
class sample_class(object):
def __init__(self, *args, **kwargs):
self.key = 'foo'
self.value = 'bar'
if __name__ == "__main__":
sample_object = sample_class()
print(sample_object.__dict__)
输出:
{'key': 'foo', 'value': 'bar'}
在 Python 中,每个对象都有一个动态字典,支持添加属性。我们将为每个实例对象有一个字典实例,占用了额外的空间,浪费了大量的 RAM。
在Python中创建一个对象时,没有默认的功能来分配一组内存来存储其所有的特性。
利用__slots__
,为设定的属性分配空间,可以减少空间的浪费,加快程序的速度。
示例代码:
class sample_class(object):
__slots__ = ['key','value']
def __init__(self, *args, **kwargs):
self.key = 'foo'
self.value = 'bar'
if __name__ == "__main__":
sample_object = sample_class()
print(sample_object.__slots__)
输出:
['key','value']
注意,当调用__slots__
变量时,我们只访问键来映射字典中的每个值。尽管 Python 的 dictionary 非常直观,但如果我们试图同时创建数千或数百万的项目,可能会出现问题。
- 字典需要内存。数以百万计的对象会吞噬掉 RAM 的使用。
- 事实上,Dictionary 是一个哈希图。
所以,对于一些属性来说,字典和槽的运行时间差异可能并不明显,但随着数据越来越大,我们会很高兴使用槽。在访问属性时,我们大约可以节省10%的运行时间。
示例代码:
import timeit
class sample_class(object):
def __init__(self, *args, **kwargs):
self.key = 'foo'
self.value = 'bar'
class sample_class_slots(object):
__slots__ = ['key','value']
def __init__(self, *args, **kwargs):
self.key = 'foo'
self.value = 'bar'
if __name__ == "__main__":
time = timeit.timeit('t.key', 'from __main__ import sample_class; t=sample_class()')
time_slots = timeit.timeit('t.key', 'from __main__ import sample_class_slots; t=sample_class_slots()')
print("Time without Slots: ", time)
print("Time with Slots: ", time_slots)
输出:
Time without Slots: 0.0202741
Time with Slots: 0.0200698
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。