Quel profileur de mémoire Python est recommandé? [fermé]

je veux connaître l'utilisation de la mémoire de mon application Python et je veux spécifiquement savoir quels blocs de code/portions ou objets consomment le plus de mémoire. Recherche Google montre un commercial est Python Mémoire Validateur (Windows uniquement).

Et l'open source sont PySizer et Heapy .

Je n'ai essayé personne, donc je voulais savoir lequel est le meilleur considérant:

  1. donne le plus de détails.

  2. je dois faire moins ou pas de modifications dans mon code.

594
demandé sur Aaron Hall 2008-09-21 08:43:04
la source

8 ответов

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 trouver d'où les objets sont référencés et obtenir des statistiques à ce sujet, mais d'une certaine façon les docs sur qui sont un peu clairsemés.

il y a aussi un navigateur graphique, écrit en Tk.

260
répondu Torsten Marek 2013-03-22 23:51:07
la source

puisque personne ne l'a mentionné, je vais pointer vers mon module memory_profiler qui est capable d'imprimer ligne par ligne rapport à l'utilisation de la mémoire et fonctionne sur Unix et Windows (nécessite psutil sur ce dernier). La sortie n'est pas très détaillée mais le but est de vous donner un aperçu de l'endroit où le code consomme plus de mémoire et pas une analyse exhaustive sur les objets alloués.

après avoir décoré votre fonction avec @profile et exécuter votre code avec le drapeau -m memory_profiler il affichera un rapport ligne par ligne comme ceci:

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
297
répondu Fabian Pedregosa 2012-05-30 18:37:42
la source

je recommande Sourcier . C'est très facile à configurer, et vous n'avez besoin d'aucune modification de votre code. Vous pouvez voir le nombre d'objets de chaque type à travers le temps, voir la liste des objets en direct, voir les références aux objets en direct, tout cela à partir de l'interface Web simple.

# 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.commencer. C'est tout.

Je n'ai pas essayé PySizer ou Heapy. J'apprécierais les commentaires des autres.

mise à JOUR

le code ci-dessus est pour CherryPy 2.X , CherryPy 3.X la méthode server.quickstart a été retiré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()
79
répondu sanxiyn 2014-02-13 13:16:05
la source

réfléchir "à l'151910920" objgraph de la bibliothèque (voir http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks pour un exemple de cas d'utilisation).

60
répondu Charles Duffy 2009-10-27 22:41:40
la source

Muppy est (encore un autre) profileur D'utilisation de la mémoire pour Python. L'accent est mis sur l'identification des fuites de mémoire.

Muppy tente d'aider les développeurs à identifier les fuites de mémoire des applications Python. Il permet le suivi de l'utilisation de la mémoire pendant l'exécution et l'identification des objets qui fuient. En outre, des outils sont fournis qui permettent de localiser la source des objets non libérés.

15
répondu Serrano 2013-03-11 18:17:42
la source

j'ai trouvé meliae à être beaucoup plus fonctionnel que Heapy ou PySizer. Si vous vous trouvez à exécuter une webapp wsgi, alors Dozer est un beau papier d'emballage middleware de Dowser

11
répondu Calen Pennington 2011-10-26 01:31:15
la source

je développe un profileur de mémoire pour Python appelé memprof:

http://jmdana.github.io/memprof /

il vous permet d'enregistrer et de tracer l'utilisation de la mémoire de vos variables pendant l'exécution des méthodes décorées. Vous avez juste à importer la bibliothèque en utilisant:

from memprof import memprof

et décorez votre méthode en utilisant:

@memprof

ceci est un exemple sur l'apparence des parcelles comme:

enter image description here

le projet est hébergé à GitHub:

https://github.com/jmdana/memprof

8
répondu jmdana 2013-07-03 16:12:50
la source

essayez aussi le pytracemalloc project qui fournit l'utilisation de la mémoire par numéro de ligne Python.

MODIFIER (2014/04): Il a désormais un Qt GUI pour analyser les instantanés.

5
répondu haypo 2014-04-03 18:49:24
la source