Economiser la mémoire lors de la création d’instances en Python avec l’attribut spécial __slots__

Votre programme crée un grand nombre d’instances de classes (par exemple, des millions) et utilise une grande quantité de mémoire.

Pour les classes qui constituent principalement des structures de données simples, vous pouvez souvent réduire considérablement l’empreinte mémoire des instances en ajoutant l’attribut spécial __slots__ à la définition de classe. Par exemple:

class Date:
    __slots__ = ['annee', 'mois', 'jour']
    def __init__(self, annee, mois, jour):
        self.annee = annee
        self.mois = mois
        self.jour = jour

 

Lorsque vous définissez l’attribut spécial __slots__, Python utilise une représentation interne beaucoup plus compacte pour les instances.

Au lieu que chaque objet soit constituée d’un dictionnaire, les instances sont construites autour d’un petit tableau de taille fixe, un peu comme un tuple ou une liste.

Les noms d’attributs listés dans le spécificateur __slots__ sont mappés en interne à des indices spécifiques dans ce tableau.

Un effet secondaire de l’utilisation de l’attribut spécial slots est qu’il n’est plus possible d’ajouter de nouveaux attributs aux instances – vous êtes limité aux noms des attributs listés dans le spécificateur __slots__.

La mémoire économisée par l’utilisation de l’attribut spécial __slots__ varie en fonction du nombre et du type d’attributs stockés. Cependant, en général, l’utilisation de la mémoire qui en résulte est comparable à celle du stockage de données dans un tuple.

Pour vous donner une idée, le stockage d’une seule instance de date sans utiliser slots nécessite 428 octets de mémoire sur une version 64 bits de Python. Si slots est défini, il tombe à 156 octets.

Dans un programme qui manipulait un grand nombre de dates en même temps, cela réduirait considérablement l’utilisation globale de la mémoire.

Bien que slots puissent sembler être une fonction qui pourrait être généralement utile, vous devriez résister à l’envie de l’utiliser dans la plupart des codes. Il y a beaucoup de parties de Python qui dépendent de l’implémentation normale basée sur les dictionnaires.

De plus, les classes qui définissent slots ne supportent pas certaines fonctionnalités comme l’héritage multiple.

Dans la plupart des cas, vous ne devriez utiliser que slots sur les classes qui vont servir de structures de données fréquemment utilisées dans votre programme (par exemple, si votre programme a créé des millions d’instances d’une classe particulière).

Une perception erronée courante de __slots__ est qu’il s’agit d’un outil d’encapsulation qui empêche les utilisateurs d’ajouter de nouveaux attributs aux instances.

Bien qu’il s’agisse d’un effet secondaire de l’utilisation de slots, cela n’a jamais été l’objectif initial. Au lieu de cela, __slots__ a toujours été conçu comme un outil d’optimisation.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here