Comment trouver le profil de consommation de mémoire de votre code Python
Comme « il y a plus d’une façon de faire » en Python, trouver l’approche la plus efficace en termes de mémoire pour certaines tâches peut s’avérer difficile. C’est là qu’un profileur de mémoire peut être utile. Outre la détection des fuites, l’estimation du profil de mémoire de votre code permet de déterminer quel code est efficace en termes de mémoire.
Que vous développiez un modèle d’apprentissage automatique ou un site web avec Python, vous pouvez estimer le profil de mémoire pour les scripts, les lignes de code individuelles ou les fonctions.
Quelques outils pour estimer le profil de mémoire en Python
L’estimation du profil de mémoire de l’ensemble de votre base de code peut s’avérer peu pratique, car elle risque de ralentir considérablement votre application. Il est préférable de profiler sélectivement les fonctions ou les méthodes que vous soupçonnez de consommer plus de mémoire. Mais même si vous voulez faire cela pour l’ensemble de votre application, vous pourriez vouloir dédier un module isolé pour le gérer.
Il existe de nombreuses bibliothèques de profilage en Python. Les plus populaires sont memory_profiler, psutil, Tracemalloc et pympler. Ce tutoriel utilise memory_profiler et psutil.
Alors que psutil est idéal pour estimer la consommation totale de mémoire lors de l’exécution d’une méthode ou d’une fonction, memory_profiler fournit des informations plus détaillées sur l’utilisation de la mémoire, y compris les tendances d’utilisation ligne par ligne et au niveau fonctionnel au fil du temps.
Pour commencer, installez memory_profiler dans votre environnement virtuel Python. Cela permet également d’installer psutil.
Obtenir la taille d’un objet en mémoire
Vous pouvez commencer votre profilage de la mémoire en calculant d’abord la taille d’un objet que vous avez l’intention d’utiliser en mémoire.
Ce type de profilage est utile au début du développement, lorsque vous essayez de déterminer le type d’objet à utiliser dans un programme.
Par exemple, si vous n’arrivez pas à décider quelles méthodes utiliser pour accomplir une tâche, disons le type de données Python approprié, vous pouvez obtenir la taille de chacune en octets afin de déterminer laquelle est la plus légère pour votre cas d’utilisation.
Les sys.getsizeof est très utile dans ce cas :
Voici la sortie :
Vous pouvez également utiliser la méthode sys.getsizeof pour comparer la taille de la mémoire d’une fonction intégrée et d’une fonction personnalisée.
Par exemple, comparez cette fonction de longueur personnalisée qui utilise une boucle for Python avec la fonction intégrée len intégrée :
Le code ci-dessus donne la sortie suivante :
Cependant, alors que la fonction sys.getsizeof mesure la taille d’un objet en mémoire, il ne tient compte que de l’objet lui-même et non de ceux qui y font référence. Pour cela, vous aurez besoin d’une méthode de profilage plus détaillée.
Trouver le profil mémoire d’une fonction Python
Vous pouvez obtenir un profil de mémoire plus détaillé pour chaque ligne de code d’une fonction à l’aide de la commande memory_profiler . Il s’agit d’ajouter le paquetage @profile à votre fonction ou méthode :
Le code ci-dessus donne un profil mémoire détaillé de chaque ligne de code dans la fonction, comme indiqué :
Le Utilisation de la mémoire indique l’utilisation de la mémoire pour une ligne de code particulière, tandis que la colonne Incrément indique la contribution de chaque ligne à l’utilisation de la mémoire. La colonne Occurrence définit le nombre de fois qu’une ligne de code alloue ou désalloue de la mémoire.
Par exemple, dans la sortie ci-dessus, la ligne 11 est apparue deux fois avec un incrément de mémoire de 0,1 MiB (Mebibyte), augmentant l’utilisation de la mémoire à 55,4 MiB. Les lignes 19 et 22 ont également contribué à hauteur de 0,2 MiB et 0,3 MiB, respectivement, ce qui porte l’utilisation totale de la mémoire à 55,9 MiB.
Déterminer le profil de mémoire d’un script Python en fonction de l’horodatage
Vous pouvez également estimer le profil de mémoire d’un script Python entier à l’aide de la fonction memory_profiler en exécutant la commande mprof dans le terminal comme indiqué :
La commande ci-dessus échantillonne le script spécifié toutes les 0,1s et crée automatiquement un fichier . dat dans le répertoire de votre projet actuel.
Les chiffres qui suivent le fichier MEM sont les profils d’utilisation de la mémoire du script Python à un intervalle de temps spécifique. Les derniers chiffres à droite représentent l’horodatage capturé par le profileur pour chaque utilisation de la mémoire.
Vous pouvez également obtenir un graphique du profil de mémoire. Cela nécessite l’installation de matplotlib:
Une fois installé, exécutez le programme mprof comme suit :
Voici le résultat dans ce cas :
Exécuter le profil de mémoire du script dans un fichier Python dédié
Vous pouvez souhaiter établir un profil pour différents scripts Python. Vous pouvez le faire en utilisant un module Python dédié via le module Python de Python.
De cette façon, vous pouvez séparer votre profileur de mémoire de votre base de code et sauvegarder la sortie du graphique localement :
Pour exécuter le profil de mémoire du script, il vous suffit d’exécuter le fichier Python contenant le code ci-dessus. Cela génère un graphique de profil de mémoire (sortie.jpg) dans le répertoire de fichiers :
Trouver la quantité de mémoire utilisée lors de l’exécution d’une fonction
Vous pouvez trouver le profil de mémoire total d’une méthode ou d’une fonction pendant son exécution à l’aide de la fonction psutil .
Par exemple, pour profiler la méthode de manipulation Pandas DataFrame précédente à l’intérieur d’un autre fichier Python :
Le tableau ci-dessus estime le profil de mémoire total de la méthode en mégaoctets (Mo), comme indiqué :
Trouver le profil de mémoire d’une ligne de code dans Jupyter Notebook
Si vous utilisez iPython dans Jupyter Notebook, vous pouvez calculer le profil de mémoire d’un one-liner à l’aide de la fonction memory_profiler. Il vous suffit de charger memory_profiler dans une seule cellule. Ensuite, ajoutez le fichier %memit à votre code dans les cellules suivantes ; cette fonction renvoie la mémoire maximale et la taille incrémentée du code.
Cette méthode ne fonctionne pas avec les scripts Python ordinaires en dehors de iPython dans Jupyter Notebook.
Par exemple :
Vous pouvez également utiliser la méthode %memit dans le bloc-notes de Jypyter pour établir le profil de la mémoire d’une fonction au moment de l’exécution :
Améliorer l’efficacité de la mémoire dans votre code Python
Compte tenu des tâches lourdes de collecte de données pour lesquelles nous utilisons souvent Python, chaque ligne de code a besoin d’une optimisation adéquate pour gérer l’utilisation de la mémoire. Bien que Python propose de nombreuses fonctions intégrées, les objets non référencés entraînent des fuites de mémoire.
Si vous avez intégré toutes les syntaxes Python qui fonctionnent dans votre base de code sans tenir compte de l’utilisation de la mémoire, vous devriez peut-être revenir en arrière avant d’aller trop loin.
Qu’est-ce que le profilage de la mémoire du code Python ?
Memory Profiler est un module purement Python qui utilise le module psutil. Il surveille la consommation de mémoire d’un processus de travail Python. Il effectue également une analyse ligne par ligne de la consommation de mémoire de l’application. Le mode d’utilisation de la mémoire ligne par ligne fonctionne de la même manière que le line_profiler.
Comment voir l’utilisation de la mémoire dans PyCharm ?
PyCharm peut vous montrer la quantité de mémoire utilisée dans la barre d’état. Utilisez-la pour déterminer la quantité de mémoire à allouer. Cliquez avec le bouton droit de la souris sur la barre d’état et sélectionnez Indicateur de mémoire.
Quelle est la quantité de mémoire allouée à Python ?
Python dispose d’un allocateur pymalloc optimisé pour les petits objets (inférieurs ou égaux à 512 octets) ayant une courte durée de vie. Il utilise des mappages de mémoire appelés « arènes » d’une taille fixe de 256 KiB.
Comment utiliser mprof en Python ?
Les commandes disponibles pour mprof sont :
- mprof run : exécution d’un exécutable, enregistrement de l’utilisation de la mémoire.
- mprof plot : tracer l’une des utilisations de la mémoire enregistrées (par défaut, la dernière).
- mprof list : liste de tous les fichiers d’utilisation de la mémoire enregistrés de manière conviviale.
- mprof clean : suppression de tous les fichiers d’utilisation de la mémoire enregistrés.