Pergunta

Eu estou usando ipython para executar o meu código. Gostaria de saber se existe qualquer módulo ou comando que permitiria me para verificar o uso de memória de um objeto. Por exemplo:

In [1]: a = range(10000)
In [2]: %memusage a
Out[2]: 1MB

Algo como %memusage <object> e retornar a memória usada pelo objeto.

Duplicar

Saiba como quantidade de memória está sendo usado por um objeto em Python

Foi útil?

Solução

Infelizmente, isso não é possível, mas há uma série de maneiras de aproximar a resposta:

  1. para objetos muito simples (por exemplo, ints, cordas, bóias, duplos) que são representados mais ou menos como os tipos de linguagem C simples que você pode simplesmente calcular o número de bytes como com John Mulder solução .

  2. Para objetos mais complexos uma boa aproximação é para serializar o objeto para uma string usando cPickle.dumps. O comprimento da corda é uma boa aproximação da quantidade de memória necessária para armazenar um objeto.

Há um grande empecilho com a solução de 2, o que é que os objetos geralmente contêm referências a outros objetos. Por exemplo um dicionário contém String-chaves e outros objetos como valores. Esses outros objetos pode ser compartilhado. Desde picles sempre tenta fazer uma serialização completa do objeto que será sempre sobre-estimar a quantidade de memória necessária para armazenar um objeto.

Outras dicas

Se você estiver usando um variedade numpy, então você pode usar o ndarray.nbytes atributo para avaliar o seu tamanho na memória:

from pylab import *   
d = array([2,3,4,5])   
d.nbytes
#Output: 32

UPDATE: Aqui está outra , receita talvez mais profunda para estimar o tamanho de um python objeto.

Aqui está um fio abordar uma pergunta semelhante

A solução proposta é escrever seu próprio ... usando algumas estimativas do tamanho conhecido de primitivas, sobrecarga de objeto do Python, e os tamanhos de construído em tipos de contêineres.

Uma vez que o código não é tanto tempo, aqui é uma cópia direta do mesmo:

def sizeof(obj):
    """APPROXIMATE memory taken by some Python objects in 
    the current 32-bit CPython implementation.

    Excludes the space used by items in containers; does not
    take into account overhead of memory allocation from the
    operating system, or over-allocation by lists and dicts.
    """
    T = type(obj)
    if T is int:
        kind = "fixed"
        container = False
        size = 4
    elif T is list or T is tuple:
        kind = "variable"
        container = True
        size = 4*len(obj)
    elif T is dict:
        kind = "variable"
        container = True
        size = 144
        if len(obj) > 8:
            size += 12*(len(obj)-8)
    elif T is str:
        kind = "variable"
        container = False
        size = len(obj) + 1
    else:
        raise TypeError("don't know about this kind of object")
    if kind == "fixed":
        overhead = 8
    else: # "variable"
        overhead = 12
    if container:
        garbage_collector = 8
    else:
        garbage_collector = 0
    malloc = 8 # in most cases
    size = size + overhead + garbage_collector + malloc
    # Round to nearest multiple of 8 bytes
    x = size % 8
    if x != 0:
        size += 8-x
        size = (size + 8)
    return size
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top