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:dá a maioria dos detalhes.
Eu tenho que fazer pelo menos, ou Não, alterações ao meu código.
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.
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
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()
Considere a biblioteca objgraph (ver http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks por exemplo, caso de Utilização).
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.
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:
O projecto está hospedado em GitHub:
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.