web-dev-qa-db-fra.com

Quel profileur de mémoire Python est recommandé?

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:

  1. Donne le plus de détails.

  2. Je dois faire le moins ou aucun changement à mon code.

648
Anurag Uniyal

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.

274
Torsten Marek

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
341
Fabian Pedregosa

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()
80
sanxiyn

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).

65
Charles Duffy

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.

16
Serrano

J'ai trouvé meliae beaucoup plus fonctionnel que Heapy ou PySizer. Si vous utilisez une application Web wsgi, alors Dozer est un wrapper de middleware de Nice pour Dowser.

12
Calen Pennington

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:

enter image description here

Le projet est hébergé dans GitHub:

https://github.com/jmdana/memprof

10
jmdana

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.

8
haypo