HOWTO · Python
Determine o tamanho de um objeto em Python
Este tutorial discute como determinar o tamanho de um objeto em Python.
Nesta página
Use sys.getsizeof() para obter o tamanho superficial de um objeto em bytes. Esse método não soma os tamanhos dos objetos referenciados por ele. Para estimar recursivamente um contêiner e seu conteúdo, use Pympler; para comparar alocações Python ao longo do tempo, use tracemalloc.
Use sys.getsizeof() para medir o tamanho superficial de um objeto
Importe sys e passe a sys.getsizeof() o valor que deseja inspecionar. O inteiro retornado indica o tamanho superficial do objeto em bytes. Por exemplo, a medida considera o próprio objeto lista, mas não os objetos armazenados nela. Essa diferença importa quando um contêiner referencia strings grandes, outros contêineres ou dados de outro tipo.
Execute este exemplo para medir um contêiner nativo do Python. A quantidade de bytes impressa é uma leitura ilustrativa de um ambiente; ela depende da implementação e da versão do Python e não é um valor fixo portátil:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import sys
values = [10, 20, 30]
size_bytes = sys.getsizeof(values)
print(f"Shallow size: {size_bytes} bytes")
Shallow size: 88 bytes
Você pode passar outros valores da mesma forma, como uma string, um inteiro ou um dicionário. Os tamanhos informados também podem variar conforme a implementação e a versão do Python. Interprete o resultado como uma medida no nível da implementação, não como garantia do uso total de memória do processo nem do custo de todos os objetos alcançáveis a partir do valor.
Inclua objetos referenciados com Pympler
Quando precisar de uma estimativa que inclua objetos alcançáveis por meio de um contêiner, o utilitário asizeof do Pympler pode contabilizar recursivamente os objetos referenciados. Instale o pacote de terceiros com pip install pympler, importe asizeof de pympler e chame a função passando o valor que deseja inspecionar.
Execute este exemplo independente depois de instalar o Pympler:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
try:
from pympler import asizeof
except ImportError:
print("Install Pympler with: pip install pympler")
else:
values = [1, 2, [3, 4]]
print(f"Recursive size: {asizeof.asizeof(values)} bytes")
O número informado depende da implementação e da versão do Python, além da versão instalada do Pympler. Portanto, trate-o como uma estimativa deste grafo de objetos, e não como um valor fixo portátil.
Essa estimativa recursiva responde a uma pergunta diferente da de sys.getsizeof(): ela inclui objetos aninhados, em vez de medir apenas o tamanho superficial do objeto externo. Ainda assim, é uma estimativa do grafo de objetos, não uma medição de todo o processo Python, da sobrecarga do alocador ou da memória residente informada pelo sistema operacional. Referências compartilhadas e detalhes da implementação podem afetar a forma como uma ferramenta recursiva contabiliza objetos. Por isso, use-a para comparar estruturas de modo consistente, e não como um total exato da memória do processo.
Rastreie alocações de memória com tracemalloc
Use o módulo tracemalloc, da biblioteca padrão, para observar as alocações de memória Python feitas durante um trecho do programa. Inicie o rastreamento antes do trabalho que deseja analisar, leia os tamanhos atual e máximo rastreados em bytes e encerre o rastreamento ao terminar. O exemplo independente a seguir aloca uma lista durante o rastreamento e informa as duas leituras; os números exibidos são leituras ilustrativas de um ambiente e variam conforme a implementação do Python e o ambiente de execução.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import tracemalloc
tracemalloc.start()
values = [number for number in range(1000)]
current_bytes, peak_bytes = tracemalloc.get_traced_memory()
print(f"Current traced memory: {current_bytes} bytes")
print(f"Peak traced memory: {peak_bytes} bytes")
tracemalloc.stop()
Current traced memory: 29536 bytes
Peak traced memory: 29536 bytes
current_bytes é a quantidade atualmente rastreada, enquanto peak_bytes é a maior quantidade rastreada desde o início do rastreamento. Para registrar uma alocação, o rastreamento precisa estar ativo antes que ela ocorra. As leituras abrangem alocações Python rastreadas, não o tamanho retido recursivamente por um objeto escolhido. Ao investigar onde ocorrem alocações, use snapshots ou compare leituras em pontos relevantes. Encerre o rastreamento quando concluir a medição para evitar que ele continue coletando dados sem necessidade.