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

王林
Libérer: 2024-08-27 06:01:36
original
684 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!