Maison >développement back-end >Tutoriel Python >Tirer parti de __slots__ pour de meilleures performances dans les classes Python

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

王林
王林original
2024-08-27 06:01:36707parcourir

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 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 ?

Leveraging __slots__ for Better Performance in Python Classes

Limites

Les

emplacements peuvent être un outil utile, mais comportent des limites :

  • Pas d'attributs dynamiques : lors de la définition des slots dans le corps de la classe on désactive 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 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.

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 machines à sous :

  • 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.
  • Quand vous avez des 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 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn