Une des manièresPythonrend le développement rapide (sans parler de plus facile que des langages commeCetC++) est la gestion de la mémoire Python. En Python, c’est simple car le langage gère la gestion de la mémoire pour vous. Toutefois, cela ne signifie pas qu’il faille oublier la mémoire. Les bons développeurs voudront suivre l’utilisation de la mémoire de leur application et chercher à réduire l’utilisation de la mémoire. Jetez un œil aux outils courants pour ce faire.
Outils pour la gestion de la mémoire Python
En plus des outils contenus dansPython de base, il existe une variété de packages disponibles pour la gestion de la mémoire. Explorons quelques-uns des plus utiles.
Outils de base pour le profilage de la mémoire Python
La couche la plus basse du profilage de la mémoire consiste à examiner un seul objet en mémoire. Vous pouvez le faire en ouvrant un shell et en faisant quelque chose comme ce qui suit :
>>> importer sys>>> sys.getsizeof({})136>>> sys.getsizeof([])32>>> sys.getsizeof(set())112
L'extrait ci-dessus illustre la surcharge associée à unlisteobjet. Une liste fait 32 octets (sur une machine 32 bits exécutant Python 2.7.3). Ce style de profilage est utile pour déterminer quel type deType de donnéesutiliser.
Travailler avec le profileur de mémoire Python
Le moyen le plus simple de profiler une seule méthode ou fonction est l'open sourceprofileur de mémoireemballer. C'est semblable àprofil_ligne, si vous connaissez ce package.
Vous pouvez l'utiliser en mettant le@profil décorateurautour de n'importe quelle fonction ou méthode et en cours d'exécutionpython -m profile_mémoire monscript. Vous verrez l'utilisation de la mémoire ligne par ligne une fois votre script terminé.
Ceci est extrêmement utile si vous souhaitez profiler une section de code gourmande en mémoire, mais cela ne vous aidera pas beaucoup si vous n'avez aucune idée de l'endroit où se situe la plus grande utilisation de la mémoire. Dans ce cas, une approche de profilage de niveau supérieur est nécessaire en premier lieu.
Essayez Guppy pour profiler une application entière en Python
depuis guppy import hpyh = hpy()print h.heap()
Cela imprimera un joli tableau d'utilisation regroupé par type d'objet. Voici un exemple dePyQt4application sur laquelle j'ai travaillé :
Partition d'un ensemble de 235760 objets. Taille totale = 19909080 octets. Nombre d'index % Taille % Cumulatif % Genre (classe / dict de classe)0 97264 41 8370996 42 8370996 42 str1 47430 20 1916788 10 10287784 52 tuple2 937 0 1106440 6 11394224 57 dict de PyQt 4.QtCore.pyqtWrapperType3 646 0 1033648 5 12427872 62 dict de module4 11683 5 841176 4 13269048 67 types.CodeType5 11684 5 654304 3 13923352 70 fonction6 1200 1 583872 3 14507224 73 dict de type7 782 0 566768 3 15073 992 76 dict (pas de propriétaire)8 1201 1 536512 3 15610504 78 type9 1019 0 499124 3 16109628 81 unicode
Ce type de profilage peut s'avérer difficile si vous disposez d'une application volumineuse utilisant un nombre relativement restreint de types d'objets.
Essayez le profileur Python mprof pour l'utilisation de la mémoire
mprof peut vous montrer l'utilisation de la mémoire pendant toute la durée de vie de votre application. Cela peut être utile si vous souhaitez voir si votre mémoire est nettoyée et libérée périodiquement.
Mieux encore, utiliser mprof est simple ; exécutez simplement mprof run script script_args dans le shell de votre choix. mprof créera automatiquement un graphique de l'utilisation de la mémoire de votre script au fil du temps, que vous pourrez visualiser en exécutant mprof plot. Il est important de noter ici que le traçage nécessite matplotlib. Ceci est utile pour déterminer l’utilisation de la mémoire du profil Python.
Profilage de l'utilisation de la mémoire pour résoudre les fuites
Si vous êtes confronté à des fuites de mémoire dans Python, le moyen le plus simple de les gérer est d'augmenter l'allocation de mémoire. Bien qu’il s’agisse d’une solution rapide, elle risque de créer un produit instable.
Une meilleure solution consiste à profiler l'utilisation de la mémoire de l'application pour mieux comprendre le code et les packages utilisés. Une fois que vous êtes en mesure de profiler la mémoire et de comprendre où se produisent les fuites, vous pouvez mieux gérer les vidages de mémoire.
Pour tenter de réparer et d'éviter les fuites de mémoire, envisagez d'exécuter des tâches gourmandes en mémoire dans des processus distincts. Cela réduira le nombre de fuites de mémoire et garantira que la mémoire n'est libérée qu'après l'exécution du code.
Luc Lee
Luke Lee vit à Dresde, en Allemagne et écrit également surwww.lukelee.me.