__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
のインスタンスはx
とy
という属性だけを持ち、それ以外の属性を動的に追加できません。これにより、各インスタンスのメモリ使用量が削減されます。
__slots__
のメリット
- メモリ効率の向上:
__dict__
を持たないため、インスタンスのメモリ使用量が削減され、特に大量のインスタンスを扱う場合に効果的です。 - パフォーマンスの向上: メモリ効率の改善に伴い、属性アクセスの速度も若干向上します。
__slots__
の制限
- 動的な属性追加ができない:
__slots__
を使用したクラスでは、指定されていない属性を後から追加することはできません。 - 継承の制限: 継承関係がある場合、親クラスで
__slots__
が使用されていると、サブクラスで属性追加が制限されることがあります。
obj = MyClass(1, 2)
obj.z = 3 # AttributeError: 'MyClass' object has no attribute 'z'
まとめ
Python
の__slots__
は、大量のインスタンスを扱う場合にメモリ効率を向上させる強力なツールです。ただし、動的な属性追加ができなくなるなどの制約があるため、必要に応じて使用するのが良いでしょう。