首页  >  文章  >  后端开发  >  利用 __slots__ 提高 Python 类的性能

利用 __slots__ 提高 Python 类的性能

王林
王林原创
2024-08-27 06:01:36686浏览

每次创建一个新类时,python 都会将每个属性存储在 dict 属性中,该属性称为动态字典。这种默认行为似乎很方便,因为它很灵活,但是当您处理大量实例或内存使用很重要时,这种开销可能会很大。

Leveraging __slots__ for Better Performance in Python Classes

老虎机”如何工作?

Python 基本上使用字典来存储类属性,但替代方案之一是使用 slots。通过定义这个名称,我们告诉 Python 使用更加静态和紧凑的结构,从而显着减少内存使用量。这是如何在类中使用槽的基本示例。

import sys 

class WithoutSlots:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class WithSlots:
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y

obj1 = WithoutSlots(1, 2)
obj2 = WithSlots(1, 2)

print(sys.getsizeof(obj1.__dict__)) # 296
print(sys.getsizeof(obj2)) # 48

如上所示,与“WithSlots”相比,“WithoutSlots”使用更多内存。考虑创建该类的多个实例 - 哪种方法是更好的选择?

Leveraging __slots__ for Better Performance in Python Classes

局限性

老虎机可能是有用的工具,但有局限性:

  • 没有动态属性:在类主体中定义时,我们禁用其默认属性(dict),因此我们无法在创建实例后动态向其添加新属性。
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

我们可以通过将 dict 添加到 slot 来解决这个问题。

  • 没有多重继承:每个基类必须包含插槽定义,否则Python将恢复使用字典来存储实例属性。

  • 无默认值:需要在init方法中明确初始化默认值。

Leveraging __slots__ for Better Performance in Python Classes

何时使用它

我写下了一些可以使用插槽的最佳场景示例:

  • 当我们有很多实例要创建时,内存使用就成为一个问题。
  • 当我们需要优化性能时。
  • 当你拥有已知且固定的属性时。
  • 当您处理大型数据集时。

Leveraging __slots__ for Better Performance in Python Classes

最后的想法

这就是 slots 在 Python 中的使用方式:当你确定你的类不需要任何其他属性并且你正在使用它们时,你可以使用它们大量实例。通过定义 slots,您可以告诉 Python 使用更高效、更紧凑的结构来存储属性,这有助于节省内存。当您关心内存使用情况或需要优化性能时,这尤其方便。请记住,使用 slots,您无法动态添加新属性,因此最好在类属性固定且定义良好时使用它。

以上是利用 __slots__ 提高 Python 类的性能的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn