Qual é o perfil de memória Python recomendado? [fechado]

quero saber o uso de memória da minha aplicação Python e, especificamente, quero saber que blocos de código/porções ou objectos estão a consumir a maior parte da memória. O Google search mostra que um comercial é o Validador de memória em Python (Apenas Para Windows).

e os de código aberto são PySizer e Heapy .

Não tentei com ninguém, por isso queria saber qual é o melhor, tendo em conta:
  1. dá a maioria dos detalhes.

  2. Eu tenho que fazer pelo menos, ou Não, alterações ao meu código.

Author: Aaron Hall, 2008-09-21

8 answers

O Heapy é bastante simples de usar. Em algum momento do seu código, você tem que escrever o seguinte:

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

Isto dá-lhe uma saída como esta:

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)

Você também pode descobrir de onde os objetos são referenciados e obter estatísticas sobre isso, mas de alguma forma os documentos sobre que são um pouco esparsos.

Existe também um navegador gráfico, escrito em Tk.

 260
Author: Torsten Marek, 2013-03-22 19:51:07

Uma vez que ninguém o mencionou, vou apontar para o meu módulo memory_profiler, que é capaz de imprimir o relatório linha-a-linha do uso da memória e funciona no Unix e Windows (necessita do psutil neste último). A saída não é muito detalhada, mas o objetivo é dar-lhe uma visão geral de onde o código está consumindo mais memória e não uma análise exaustiva sobre objetos alocados.

Depois de decorar a sua função com @profile e de executar o seu código com a bandeira -m memory_profiler irá imprimir um relatório linha a linha como este:

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
Author: Fabian Pedregosa, 2012-05-30 14:37:42

Eu recomendoDowser . É muito fácil de configurar, e você precisa de zero alterações ao seu código. Você pode ver contagens de objetos de cada tipo através do tempo, Ver lista de objetos vivos, ver referências a objetos vivos, tudo a partir da interface web simples.

# 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)
Importa o memdebug e liga para o memdebug.Comece. Só isso. Ainda não experimentei PySizer ou Heapy. Eu apreciaria as opiniões dos outros.

Actualizar

O código acima é para CherryPy 2.X, CherryPy 3.X O Método server.quickstart foi removido e engine.start não pega a bandeira blocking. Então, se você está usando 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
Author: sanxiyn, 2014-02-13 09:16:05

Considere a biblioteca objgraph (ver http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks por exemplo, caso de Utilização).

 60
Author: Charles Duffy, 2009-10-27 19:41:40

O Muppy é (mais um) Profiler de Uso de memória para o Python. O foco deste conjunto de ferramentas é colocado na identificação de vazamentos de memória.

O Muppy tenta ajudar os programadores a identificar fugas de memória das aplicações Python. Ele permite o rastreamento do uso da memória durante o período de execução e a identificação de objetos que estão vazando. Além disso, ferramentas são fornecidas que permitem localizar a fonte de objetos não liberados.

 15
Author: Serrano, 2013-03-11 14:17:42

Achei meliae muito mais funcional do que o Heapy ou o PySizer. Se por acaso estiver a correr um webapp wsgi, então o Dozer é um bom invólucro de middleware do Dowser

 11
Author: Calen Pennington, 2011-10-25 21:31:15
Estou a desenvolver um profiler de memória para o Python chamado memprof:

Http://jmdana.github.io/memprof/

Permite-lhe registar e traçar o uso da memória das suas variáveis durante a execução dos métodos decorados. Você só tem que importar a biblioteca usando:

from memprof import memprof

E decorar o seu método usando:

@memprof

Este é um exemplo de como as parcelas parecem:

enter image description here

O projecto está hospedado em GitHub:

Https://github.com/jmdana/memprof

 8
Author: jmdana, 2013-07-03 12:12:50

Tente também o projecto pytracemalloc que oferece a utilização da memória por número de linha Python.

EDIT (2014/04): ele agora tem uma GUI Qt para analisar instantâneos.

 5
Author: haypo, 2014-04-03 14:49:24