Je souhaite connaître l'utilisation de la mémoire de mon application Python et plus précisément, quels sont les blocs/parties de code ou les objets qui consomment le plus de mémoire. La recherche Google indique qu’un programme commercial est Validateur de mémoire Python (Windows uniquement).
Et ceux qui sont open source sont PySizer et Heapy .
Je n'ai essayé personne, alors je voulais savoir lequel est le meilleur compte tenu:
Donne le plus de détails.
Je dois faire le moins ou aucun changement à mon code.
Heapy est assez simple à utiliser. À un moment donné dans votre code, vous devez écrire ce qui suit:
from guppy import hpy
h = hpy()
print h.heap()
Cela vous donne une sortie comme ceci:
Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 35144 27 2140412 26 2140412 26 str
1 38397 29 1309020 16 3449432 42 Tuple
2 530 0 739856 9 4189288 50 dict (no owner)
Vous pouvez également savoir où les objets sont référencés et obtenir des statistiques à ce sujet, mais d'une manière ou d'une autre, la documentation est un peu clairsemée.
Il existe également un navigateur graphique, écrit en Tk.
Puisque personne ne l’a mentionné, je vais pointer sur mon module memory_profiler qui est capable d’imprimer un rapport ligne par ligne sur l’utilisation de la mémoire et fonctionne sous Unix et Windows (nécessite psutil pour ce dernier). La sortie n'est pas très détaillée, mais l'objectif est de vous donner une vue d'ensemble des endroits où le code consomme plus de mémoire et non une analyse exhaustive des objets alloués.
Après avoir décoré votre fonction avec @profile
et exécuté votre code avec l'indicateur -m memory_profiler
, il imprimera un rapport ligne par ligne comme suit:
Line # Mem usage Increment Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a
Je recommande Dowser . Il est très facile à installer et vous n'avez besoin d'aucun changement dans votre code. Vous pouvez afficher le nombre d'objets de chaque type dans le temps, afficher la liste des objets en direct, afficher les références aux objets en direct, le tout à partir de la simple interface Web.
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.server.quickstart()
cherrypy.engine.start(blocking=False)
Vous importez memdebug et appelez memdebug.start. C'est tout.
Je n'ai pas essayé PySizer ou Heapy. J'apprécierais les critiques des autres.
UPDATE
Le code ci-dessus concerne CherryPy 2.X
, CherryPy 3.X
, la méthode server.quickstart
a été supprimée et engine.start
ne prend pas le drapeau blocking
. Donc, si vous utilisez CherryPy 3.X
# memdebug.py
import cherrypy
import dowser
def start(port):
cherrypy.tree.mount(dowser.Root())
cherrypy.config.update({
'environment': 'embedded',
'server.socket_port': port
})
cherrypy.engine.start()
Considérez la bibliothèque objgraph (voir http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks pour un exemple de cas d'utilisation).
Muppy est (encore un autre) Profileur d'utilisation de la mémoire pour Python. Cet ensemble d'outils met l'accent sur l'identification des fuites de mémoire.
Muppy tente d'aider les développeurs à identifier les fuites de mémoire d'applications Python. Il permet de suivre l'utilisation de la mémoire pendant l'exécution et d'identifier les objets qui fuient. De plus, des outils sont fournis qui permettent de localiser la source des objets non libérés.
Je développe un profileur de mémoire pour Python appelé memprof:
http://jmdana.github.io/memprof/
Il vous permet de consigner et de tracer l'utilisation de la mémoire de vos variables lors de l'exécution des méthodes décorées. Vous devez juste importer la bibliothèque en utilisant:
from memprof import memprof
Et décorez votre méthode en utilisant:
@memprof
Voici un exemple de la façon dont les parcelles se présentent:
Le projet est hébergé dans GitHub:
Essayez également le projet pytracemalloc qui fournit l'utilisation de la mémoire par numéro de ligne Python.
EDIT (2014/04): Il dispose désormais d'une interface graphique Qt pour analyser les instantanés.