"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Tirer parti de __slots__ pour de meilleures performances dans les classes Python

Tirer parti de __slots__ pour de meilleures performances dans les classes Python

Publié le 2024-11-12
Parcourir:818

Chaque fois que nous créons une nouvelle classe, Python stocke chaque attribut dans un attribut dict qui est appelé dictionnaire dynamique. Ce comportement par défaut semble pratique, car il est flexible, mais lorsque vous travaillez avec un grand nombre d'instances ou que l'utilisation de la mémoire est importante, cette surcharge peut être importante.

Leveraging __slots__ for Better Performance in Python Classes

Comment fonctionnent les « emplacements » ?

Python utilise essentiellement un dictionnaire pour stocker les attributs de classe, mais l'une des alternatives consiste à utiliser slots. En définissant ce nom, nous demandons à Python d'utiliser une structure plus statique et compacte qui réduit considérablement l'utilisation de la mémoire. Voici un exemple de base de la façon d'utiliser les emplacements dans une classe.

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

Comme indiqué ci-dessus, « WithoutSlots » utilise beaucoup plus de mémoire que « WithSlots ». Pensez à créer de nombreuses instances de la classe : quelle approche serait le meilleur choix ?

Leveraging __slots__ for Better Performance in Python Classes

Limites

slots peut être un outil utile, mais comporte des limites :

  • Aucun attribut dynamique : lors de la définition de slots dans le corps de la classe, nous désactivons son attribut par défaut (dict), nous ne pouvons donc pas ajouter dynamiquement de nouveaux attributs à l'instance après sa création.
obj = WithSlots(1, 2)
obj.z = 3  # This will raise an AttributeError

Nous pouvons contourner ce problème en ajoutant dict au slot.

  • Pas d'héritage multiple : chaque classe de base doit contenir des slots définis, sinon python reviendra à l'utilisation d'un dictionnaire pour stocker les attributs d'instance.

  • Aucune valeur par défaut : vous devez explicitement initialiser les valeurs par défaut dans la méthode init.

Leveraging __slots__ for Better Performance in Python Classes

Quand l'utiliser

J'ai écrit quelques meilleurs exemples de scénarios dans lesquels nous pouvons utiliser les emplacements :

  • Lorsque nous avons beaucoup d'instances à créer et que l'utilisation de la mémoire est un problème.
  • Quand nous devons optimiser les performances.
  • Lorsque vous disposez d'attributs connus et corrigés.
  • Lorsque vous travaillez avec de grands ensembles de données.

Leveraging __slots__ for Better Performance in Python Classes

Réflexions finales

Voici comment les slots sont utilisés en Python : vous pouvez les utiliser lorsque vous êtes certain que vous n'aurez besoin d'aucun autre attribut pour votre classe et que vous travaillez avec un grand nombre de cas. En définissant slots, vous demandez à Python d'utiliser une structure plus efficace et plus compacte pour stocker les attributs, ce qui permet d'économiser de la mémoire. Ceci est particulièrement pratique lorsque l'utilisation de la mémoire est un problème ou lorsque vous devez optimiser les performances. N'oubliez pas qu'avec slots, vous ne pouvez pas ajouter de nouveaux attributs de manière dynamique, il est donc préférable de l'utiliser lorsque vos attributs de classe sont fixes et bien définis.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/conradylx/leveraging-slots-for-better-performance-in-python-classes-2ol4?1 En cas de violation, veuillez contacter [email protected] pour supprimer il
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3