Descobrir o quanto de memória está sendo usado por um objeto em Python

votos
149

Como você iria sobre descobrir quanta memória está sendo usado por um objeto? Eu sei que é possível descobrir o quanto é usado por um bloco de código, mas não por um objeto instanciado (a qualquer momento durante a sua vida), que é o que eu quero.

Publicado 29/08/2008 em 05:59
fonte usuário
Em outras línguas...                            


6 respostas

votos
85

Não há nenhuma maneira fácil de descobrir o tamanho da memória de um objeto de python . Um dos problemas que você pode encontrar é que os objetos Python - como listas e dicts - pode ter referências a outros objetos python (neste caso, qual seria o seu tamanho ser o tamanho contendo o tamanho de cada objeto ou não?). Existem algumas indicações gerais e estruturas internas relacionadas com tipos de objetos e coleta de lixo. Finalmente, alguns objetos python têm comportamentos não-óbvias. Por exemplo, lista espaço de reserva para mais objetos do que eles têm, na maioria das vezes; dicts são ainda mais complicada, uma vez que pode operar em modos diferentes (eles têm uma implementação diferente para pequeno número de chaves e às vezes mais de alocar entradas).

Há um grande pedaço de código (e um grande pedaço atualizada do código ) lá fora para tentar melhor aproximar o tamanho de um objeto de python na memória.

Você também pode querer verificar alguns antiga descrição sobre PyObject (a estrutura interna C que representa praticamente todos os objetos python).

Respondeu 30/08/2008 em 04:25
fonte usuário

votos
67

Tente isto:

sys.getsizeof(object)

getsizeof () chama o objeto do __sizeof__método e acrescenta uma sobrecarga coletor de lixo adicional se o objeto é gerenciado pelo coletor de lixo.

Uma receita recursiva

Respondeu 08/11/2013 em 19:11
fonte usuário

votos
25

Outra abordagem é usar picles. Veja esta resposta a um duplicado desta questão.

Respondeu 16/10/2012 em 23:25
fonte usuário

votos
4

Eu não tenho nenhuma experiência pessoal com um dos seguintes procedimentos, mas uma pesquisa simples para um "Python [memória] profiler" rendimento:

  • PySizer "um profiler de memória para Python," encontrado na http://pysizer.8325.org/ . No entanto, a página parece indicar que o projeto não foi atualizado por um tempo, e refere-se a ...

  • Heapy, "suporte depuração [ing] e otimização sobre problemas de memória relacionados em programas Python", encontrados em http://guppy-pe.sourceforge.net/#Heapy .

Espero que ajude.

Respondeu 29/08/2008 em 06:33
fonte usuário

votos
2

Isso deve ser usado com cuidado porque uma substituição nos objetos __sizeof__ pode ser enganosa.

Usando o bregman.suite, alguns testes com saída sys.getsizeof uma cópia de um objecto de dados (matriz), numa instância de objecto como sendo maior do que o próprio objecto (MFCC).

>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>
Respondeu 03/01/2014 em 15:54
fonte usuário

votos
-2

Para grandes objetos que você pode usar um método um pouco bruto, mas eficaz: verificar quanta memória seu processo de Python ocupa no sistema, em seguida, excluir o objeto e comparar.

Este método tem muitas desvantagens, mas ele vai te dar uma estimativa muito rápida para muito grandes objetos.

Respondeu 30/06/2014 em 17:44
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more