__slots__の使い方とメリット

Pythonでクラスを定義すると、デフォルトでインスタンスごとに__dict__が作成され、属性が動的に管理されます。しかし、特定の用途ではメモリ効率を重視することが必要です。このような場合、__slots__を使用してメモリ使用量を削減できます。

__slots__とは?

__slots__はクラス内で定義できる特殊属性で、クラスインスタンスの属性を固定する役割を持ちます。通常、Pythonクラスは__dict__を持つため、属性を動的に追加できますが、__slots__を使用すると__dict__を無効にし、事前に指定した属性のみを持つように制限します。

class MyClass:
    __slots__ = ['x', 'y']  # 属性を固定
    def __init__(self, x, y):
        self.x = x
        self.y = y

この例では、MyClassのインスタンスはxyという属性だけを持ち、それ以外の属性を動的に追加できません。これにより、各インスタンスのメモリ使用量が削減されます。

__slots__のメリット

  • メモリ効率の向上: __dict__を持たないため、インスタンスのメモリ使用量が削減され、特に大量のインスタンスを扱う場合に効果的です。
  • パフォーマンスの向上: メモリ効率の改善に伴い、属性アクセスの速度も若干向上します。

__slots__の制限

  • 動的な属性追加ができない: __slots__を使用したクラスでは、指定されていない属性を後から追加することはできません。
  • 継承の制限: 継承関係がある場合、親クラスで__slots__が使用されていると、サブクラスで属性追加が制限されることがあります。
obj = MyClass(1, 2)
obj.z = 3  # AttributeError: 'MyClass' object has no attribute 'z'

まとめ

Python__slots__は、大量のインスタンスを扱う場合にメモリ効率を向上させる強力なツールです。ただし、動的な属性追加ができなくなるなどの制約があるため、必要に応じて使用するのが良いでしょう。