Question 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. La recherche Google montre un commercial est Python Memory Validator (Windows seulement).

Et ceux de source ouverte sont PySizer et Heapy.

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

  1. Donne la plupart des détails.

  2. Je dois faire au moins ou pas de changements à mon code.


577
2017-09-21 04:43


origine


Réponses:


Heapy est assez simple à utiliser. À un certain moment dans votre code, vous devez écrire ce qui suit:

from guppy import hpy
h = hpy()
print h.heap()

Cela vous donne quelques résultats 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 en quelque sorte les documents sur ce sont un peu rares.

Il y a aussi un navigateur graphique écrit en Tk.


255
2017-09-21 11:45



Puisque personne ne l'a mentionné, je vais pointer vers mon module memory_profiler qui est capable d'imprimer le rapport ligne par ligne de l'utilisation de la mémoire et fonctionne sous Unix et Windows (nécessite psutil sur ce dernier). La sortie n'est pas très détaillée mais l'objectif est de vous donner une vue d'ensemble de l'endroit 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écuter votre code avec le -m memory_profiler flag il va imprimer 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

287
2018-05-14 22:51



je recommande Sourcier. Il est très facile à configurer et vous n'avez besoin d'aucune modification de 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 vivants, 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.

METTRE À JOUR

Le code ci-dessus est pour CherryPy 2.X, CherryPy 3.X la server.quickstart la méthode a été enlevée et engine.start ne prend pas le blocking drapeau. 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()

78
2017-09-21 04:50



Prendre en compte objgraph bibliothèque (voir http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks pour un exemple de cas d'utilisation).


59
2017-10-27 19:41



Muppy est (encore un autre) Memory Usage Profiler pour Python. L'objectif de cet outil est posé sur l'identification des fuites de mémoire.

Muppy essaie 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. De plus, des outils sont fournis qui permettent de localiser la source des objets non libérés.


15
2018-03-11 14:17



j'ai trouvé meliae être beaucoup plus fonctionnel que Heapy ou PySizer. Si vous exécutez une application web wsgi, alors Dozer est un joli emballage de middleware de Dowser


11
2017-10-25 21:31



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

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

Il vous permet de vous connecter 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 simplement importer la bibliothèque en utilisant:

from memprof import memprof

Et décorez votre méthode en utilisant:

@memprof

Ceci est un exemple sur la façon dont les parcelles ressemblent:

enter image description here

Le projet est hébergé dans GitHub:

https://github.com/jmdana/memprof


8
2017-07-03 12:12



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

EDIT (2014/04): Il a maintenant une interface graphique Qt pour analyser les snapshots.


5
2017-09-04 22:56