Slots in Python verstehen

Slots in Python verstehen

Das Erstellen von Objekten für Klassen erfordert Speicher, und das gespeicherte Attribut hat die Form eines Wörterbuchs. Es wird viel Speicher und Indizierungszeit in Anspruch nehmen, wenn wir Tausende von Objekten zuweisen müssen.

Slots oder __slots__ bieten einen einzigartigen Mechanismus, um die Größe von Objekten zu reduzieren und die Indizierung zu beschleunigen. In diesem Artikel wird erläutert, wie die konstante Variable slot in Python funktioniert und warum sie besser ist als die Verwendung von Wörterbüchern.

Slots in Python verstehen

Slots ist ein Konzept der Speicheroptimierung für Objekte, das die Laufzeit unseres Python-Codes verbessern würde. Wenn wir beispielsweise ein benutzerdefiniertes Objekt aus einer Klasse erstellen, heißen die Attribute des gespeicherten Objekts in einem Wörterbuch __dict__.

Darüber hinaus ermöglicht es uns, neue Attribute nach der Erstellung des Objekts dynamisch zu erstellen.

Ohne Slots würden unsere Objekte wie im folgenden Snippet unten aussehen.

Beispielcode:

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__)

Ausgang:

{'key': 'foo', 'value': 'bar'}

In Python hat jedes Objekt ein dynamisches Wörterbuch, das das Hinzufügen von Attributen unterstützt. Wir werden eine Dictionary-Instanz für jedes Instanzobjekt haben, was zusätzlichen Speicherplatz beansprucht und viel RAM verschwendet.

Beim Erstellen eines Objekts in Python gibt es keine Standardfunktion zum Zuweisen einer festgelegten Speichermenge zum Speichern aller seiner Eigenschaften.

Die Verwendung von __slots__, die Platz für eine festgelegte Anzahl von Attributen bereitstellen, reduziert die Platzverschwendung und beschleunigt das Programm.

Beispielcode:

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__)

Ausgang:

['key','value']

Beachten Sie, dass wir beim Aufrufen der Variablen __slots__ nur auf die Schlüssel zugreifen, um jeden Wert in einem Wörterbuch abzubilden. Obwohl das Wörterbuch von Python unglaublich intuitiv ist, kann es Probleme geben, wenn wir versuchen, Tausende oder Millionen von Elementen gleichzeitig zu erstellen.

  1. Wörterbuch braucht Speicher. Millionen von Objekten werden die RAM-Nutzung auffressen.
  2. Dictionary ist eigentlich eine Hash-Map.

Der Laufzeitunterschied zwischen dem Wörterbuch und den Slots mag also bei einigen Attributen nicht bemerkbar sein, aber wenn die Datenmenge größer wird, werden wir froh sein, dass wir Slots verwendet haben. Ungefähr 10 % der Laufzeit können wir beim Zugriff auf Attribute einsparen.

Beispielcode:

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)

Ausgang:

Time without Slots:  0.0202741
Time with Slots:  0.0200698
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn