了解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 非常直观,但如果我们试图同时创建数千或数百万的项目,可能会出现问题。

  1. 字典需要内存。数以百万计的对象会吞噬掉 RAM 的使用。
  2. 事实上,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