Maison >développement back-end >Tutoriel Python >Tirer parti de __slots__ pour de meilleures performances dans les classes Python
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.
Python utilise essentiellement un dictionnaire pour stocker les attributs de classe, mais l'une des alternatives consiste à utiliser des 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 ?
emplacements peuvent être un outil utile, mais comportent des limites :
obj = WithSlots(1, 2) obj.z = 3 # This will raise an AttributeError
Nous pouvons contourner ce problème en ajoutant dict au emplacement.
Pas d'héritage multiple : chaque classe de base doit contenir des emplacements 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 explicitement dans la méthode init.
J'ai écrit quelques meilleurs exemples de scénarios dans lesquels nous pouvons utiliser les machines à sous :
Voici comment les slots sont utilisés en Python : vous pouvez les utiliser lorsque vous êtes certain de n'avoir besoin d'aucun autre attribut pour votre classe et que vous travaillez avec un grand nombre de cas. En définissant des 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 les 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!