Connaître la taille d'un objet avec sys.getsizeof() en Python

1. À propos de sys.getsizeof()

Le module sys fournit la fonction sys.getsizeof() qui permet d'obtenir la taille occupée en mémoire par un objet Python, exprimée en octets.

Cette fonction est utile pour étudier la représentation mémoire des objets Python, comparer certaines structures de données et mieux comprendre leur consommation de mémoire.

Le programme suivant calcule la taille d'une chaîne de caractères.

Sortie possible :

La valeur exacte peut varier selon la version de Python, son implémentation, l'architecture de la machine et le type de l'objet. Il ne faut donc pas considérer les valeurs numériques présentées dans ce tutoriel comme universelles.

2. Connaître la taille d'un objet avec sys.getsizeof()

La syntaxe générale de sys.getsizeof() est simple : nous passons l'objet dont nous souhaitons connaître la taille en argument.

Le programme suivant calcule la taille de plusieurs objets simples.

Sortie possible :

La fonction sys.getsizeof() retourne un entier représentant une taille en octets.

Nous pouvons le vérifier avec la fonction type().

Sortie :

3. Connaître la taille des nombres

Nous pouvons utiliser sys.getsizeof() pour étudier la taille des objets numériques. En Python, les entiers ne sont pas limités à une taille fixe comme dans de nombreux langages : leur représentation peut grandir lorsque leur valeur nécessite davantage de mémoire.

Le programme suivant compare plusieurs entiers.

Sortie possible :

Nous constatons qu'un entier très grand peut nécessiter davantage de mémoire qu'un petit entier.

Le programme suivant compare maintenant différents types numériques.

Sortie possible :

Ces résultats correspondent à une implémentation et à un environnement donnés et peuvent donc différer sur une autre installation Python.

4. Connaître la taille des chaînes de caractères

La fonction sys.getsizeof() peut également mesurer la taille d'une chaîne de caractères. Cette taille ne correspond pas simplement au nombre de caractères de la chaîne.

Le programme suivant compare la longueur d'une chaîne avec sa taille en mémoire.

Sortie possible :

La fonction len() indique ici le nombre de caractères, tandis que sys.getsizeof() retourne la taille de l'objet Python en mémoire.

Nous pouvons comparer des chaînes de longueurs différentes.

Sortie possible :

La taille dépend notamment du contenu de la chaîne et de la manière dont Python représente les caractères en mémoire.

5. Connaître la taille des listes et des tuples

La fonction sys.getsizeof() peut être utilisée sur des structures comme les listes et les tuples. Il faut cependant comprendre que la valeur retournée correspond directement à l'objet conteneur et ne représente pas nécessairement la somme de toute la mémoire utilisée par les objets qu'il référence.

Le programme suivant compare la taille d'une liste et d'un tuple contenant les mêmes références.

Sortie possible :

Dans cet exemple, le tuple peut occuper moins d'espace directement que la liste. Les valeurs exactes dépendent toutefois de l'implémentation et de la version de Python.

Le programme suivant montre également que la taille directe d'une liste peut évoluer lorsque nous lui ajoutons des éléments.

Sortie possible :

Une liste peut réserver de la capacité supplémentaire afin de permettre l'ajout efficace de nouveaux éléments. Sa taille ne grandit donc pas nécessairement à chaque appel à append().

6. Connaître la taille des dictionnaires et des ensembles

sys.getsizeof() fonctionne également avec les dictionnaires et les ensembles. Ces structures utilisent des organisations internes adaptées à la recherche rapide des éléments.

Le programme suivant calcule la taille directe d'un dictionnaire.

Sortie possible :

Cette valeur correspond à la taille directe du dictionnaire. Elle ne doit pas être interprétée comme la somme de la mémoire de toutes ses clés et de toutes ses valeurs.

Nous pouvons également comparer directement un ensemble avec une liste contenant les mêmes valeurs.

Sortie possible :

Il ne faut pas conclure uniquement à partir de cette taille qu'une structure est meilleure qu'une autre. Une liste et un set n'ont pas les mêmes propriétés ni les mêmes usages.

7. Comparer la taille de plusieurs objets

La fonction sys.getsizeof() permet de comparer rapidement la taille directe de différents objets Python dans un environnement donné.

Le programme suivant compare plusieurs objets vides.

Sortie possible :

Ces mesures permettent d'observer que chaque type Python possède sa propre représentation interne et donc un certain coût mémoire.

Nous pouvons également comparer plusieurs collections contenant le même nombre de valeurs.

Sortie possible :

8. Comprendre les limites de sys.getsizeof()

Une limitation très importante de sys.getsizeof() est que cette fonction mesure la taille directe de l'objet passé en argument. Pour un conteneur, elle n'additionne pas automatiquement la taille de tous les objets référencés par ce conteneur.

Le programme suivant compare une liste contenant trois chaînes courtes avec une liste contenant trois chaînes beaucoup plus longues.

Sortie possible :

Les deux listes peuvent avoir la même taille directe parce qu'elles contiennent le même nombre de références, même si les chaînes référencées n'occupent pas la même quantité de mémoire.

Pour constater la différence, nous pouvons additionner séparément la taille directe des chaînes contenues dans chaque liste.

Sortie possible :

Cette addition convient à cet exemple simple, mais elle ne constitue pas une méthode générale de calcul de la mémoire totale. Des objets peuvent être partagés, imbriqués ou contenir des références circulaires.

9. Calculer récursivement la taille d'un objet composé

Pour obtenir une estimation plus complète de la taille d'une structure composée, nous pouvons parcourir récursivement ses éléments. Il faut cependant éviter de compter plusieurs fois le même objet lorsqu'il est référencé à plusieurs endroits.

Le programme suivant définit une fonction taille_totale() qui traite quelques conteneurs courants et mémorise les objets déjà visités grâce à leur identifiant retourné par id().

Sortie possible :

Cette fonction fournit une estimation récursive plus complète pour les types de conteneurs qu'elle prend en charge. Elle ne constitue cependant pas un outil universel de mesure de toute la mémoire réellement consommée par un programme Python.

Le même principe peut être appliqué à une structure imbriquée contenant plusieurs listes.

Sortie possible :

10. À retenir !

La fonction sys.getsizeof() du module sys permet de connaître la taille directe d'un objet Python en mémoire, exprimée en octets. Elle constitue un outil simple pour observer et comparer la représentation mémoire de différents objets.

  • sys.getsizeof(objet) retourne une taille en octets.
  • La valeur retournée est un entier de type int.
  • La taille d'un objet dépend de son type et de sa représentation interne.
  • Les très grands entiers peuvent nécessiter davantage de mémoire que les petits entiers.
  • La taille d'une chaîne n'est pas simplement égale au nombre de ses caractères.
  • Les listes, tuples, dictionnaires et ensembles ont des représentations mémoire différentes.
  • Pour un conteneur, sys.getsizeof() n'additionne pas automatiquement la taille de tous les objets qu'il référence.
  • Deux conteneurs de même taille directe peuvent référencer des objets dont les tailles sont très différentes.
  • Un parcours récursif peut fournir une estimation plus complète pour certaines structures imbriquées.
  • Les valeurs retournées peuvent varier selon la version, l'implémentation de Python et l'architecture utilisée.

Le programme suivant compare la taille directe d'une liste avec la somme de sa taille et de celle de ses éléments. Il illustre la différence entre la taille du conteneur lui-même et une estimation simple incluant ses éléments.

Sortie possible :

 


 


Auteur : Younes Derfoufi
Lieu de travail : CRMEF OUJDA
Site Web : www.tresfacile.net
Chaine YouTube : https://www.youtube.com/user/InformatiquesFacile
Me contacter : https://www.tresfacile.net/me-contacter/


Leave a Reply

Your email address will not be published. Required fields are marked *