736 votes

Quel Python profiler de mémoire est recommandé ?

Je veux savoir l'utilisation de la mémoire de mon application en Python et plus précisément voulez savoir ce que les blocs de code/des portions ou des objets consomment le plus de mémoire. Recherche Google montre un commercial est un Python de la Mémoire du programme de validation.

Et l'open source sont PySizer et Heapy.

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

  1. Donne plus de détails.

  2. J'ai à faire moins ou pas de modifications dans mon code.

476voto

Fabian Pedregosa Points 1611

Puisque personne n'a mentionné, je vais le point à mon module memory_profiler qui est capable d'imprimer, ligne par ligne, rapport de l'utilisation de la mémoire et fonctionne sur Unix et Windows (besoins psutil sur cette dernière). De sortie n'est pas très détaillé, mais le but est de vous donner un aperçu de l'endroit où le code est de consommer plus de mémoire et non pas une analyse exhaustive sur les objets alloués.

Après la décoration de votre fonction avec @profile et l'exécution de votre code avec l' -m memory_profiler drapeau, il permet d'imprimer une ligne-par-rapport de la 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

310voto

Torsten Marek Points 27554

Heapy est très simple à utiliser. À un certain point dans votre code, vous devez écrire ce qui suit :

Cela vous donne une sortie comme ceci :

Vous pouvez également trouver d'où les objets sont référencés et obtenir des statistiques à ce sujet, mais en quelque sorte les docs sur qui sont un peu clairsemées.

Il y a un navigateur graphique, écrit en savoirs traditionnels.

84voto

sanxiyn Points 2704

Je vous recommande de Sourcier. Il est très facile d'installation, et vous avez besoin d'aucun changement de votre code. Vous pouvez le nombre de vues d'objets de chaque type à travers le temps, voir la liste des objets en direct, voir les références à des objets animés, le tout à 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 d'appeler memdebug.commencer. C'est tout.

Je n'ai pas essayé PySizer ou Heapy. J'aimerais avoir d'autres avis.

Mise à JOUR

Le code ci-dessus est pour CherryPy 2.X, CherryPy 3.X le server.quickstart méthode a été supprimé et engine.start ne pas prendre l' 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()

69voto

Charles Duffy Points 34134

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

12voto

Calen Pennington Points 111

J'ai trouvé que Meliae était beaucoup plus fonctionnelle que Heapy ou PySizer. Si vous exécutez une application web wsgi, alors Dozer est un joli wrapper middleware de Dowser

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X