„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Nutzung von __slots__ für eine bessere Leistung in Python-Klassen

Nutzung von __slots__ für eine bessere Leistung in Python-Klassen

Veröffentlicht am 12.11.2024
Durchsuche:310

Jedes Mal, wenn wir eine neue Klasse erstellen, speichert Python jedes Attribut in einem dict-Attribut, das als dynamisches Wörterbuch bezeichnet wird. Dieses Standardverhalten scheint praktisch zu sein, da es flexibel ist, aber wenn Sie mit einer großen Anzahl von Instanzen arbeiten oder die Speichernutzung wichtig ist, kann dieser Overhead erheblich sein.

Leveraging __slots__ for Better Performance in Python Classes

Wie funktionieren „Slots“?

Python verwendet grundsätzlich ein Wörterbuch zum Speichern von Klassenattributen, aber eine der Alternativen ist die Verwendung von Slots. Durch die Definition dieses Namens weisen wir Python an, eine statischere und kompaktere Struktur zu verwenden, die den Speicherverbrauch erheblich reduziert. Hier ist ein einfaches Beispiel für die Verwendung von Slots in einer Klasse.

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

Wie oben gezeigt, verbraucht „WithoutSlots“ viel mehr Speicher als „WithSlots“. Denken Sie darüber nach, viele Instanzen der Klasse zu erstellen. Welcher Ansatz wäre die bessere Wahl?

Leveraging __slots__ for Better Performance in Python Classes

Einschränkungen

slots kann ein nützliches Werkzeug sein, bringt aber Einschränkungen mit sich:

  • Keine dynamischen Attribute: Beim Definieren von Slots im Klassenkörper deaktivieren wir dessen Standardattribut (dict), Daher können wir der Instanz nach ihrer Erstellung keine neuen Attribute dynamisch hinzufügen.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

Wir können dies umgehen, indem wir dict zum Slot hinzufügen.

  • Keine Mehrfachvererbung: Jede Basisklasse muss Slots definiert enthalten, andernfalls verwendet Python wieder das Wörterbuch zum Speichern der Instanzattribute.

  • Kein Standardwert: Sie müssen Standardwerte explizit in der Init-Methode initialisieren.

Leveraging __slots__ for Better Performance in Python Classes

Wann sollte man es verwenden?

Ich habe einige der besten Szenariobeispiele aufgeschrieben, in denen wir Slots verwenden können:

  • Wenn wir viele Instanzen erstellen müssen und die Speichernutzung ein Problem darstellt.
  • Wenn wir die Leistung optimieren müssen.
  • Wenn Sie über bekannte und festgelegte Attribute verfügen.
  • Wenn Sie mit großen Datensätzen arbeiten.

Leveraging __slots__ for Better Performance in Python Classes

Letzte Gedanken

So werden Slots in Python verwendet: Sie können sie verwenden, wenn Sie sicher sind, dass Sie keine anderen Attribute für Ihre Klasse benötigen und mit ihnen arbeiten eine große Anzahl von Instanzen. Durch die Definition von slots weisen Sie Python an, eine effizientere und kompaktere Struktur zum Speichern von Attributen zu verwenden, was hilft, Speicherplatz zu sparen. Dies ist besonders praktisch, wenn die Speichernutzung ein Problem darstellt oder Sie die Leistung optimieren müssen. Denken Sie daran, dass Sie mit slots keine neuen Attribute dynamisch hinzufügen können. Daher ist die Verwendung am besten, wenn Ihre Klassenattribute fest und klar definiert sind.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/conradylx/leveraging-slots-for-better-performance-in-python-classes-2ol4?1 Bei Verstößen wenden Sie sich zum Löschen bitte an [email protected] Es
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3