15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

import waste_memory

x = waste_memory.run()

found_objects = gc.get_objects()

print('%d objects after' % len(found_objects))

for obj in found_objects[:3]:

print(repr(obj)[:100])

>>>

4756 objects before

14873 objects after

<waste_memory.MyObject object at 0x1063f6940>

<waste_memory.MyObject object at 0x1063f6978>

<waste_memory.MyObject object at 0x1063f69b0>

O problema com gc.get_objects é que não diz nada sobre como os objetos foram

alocados. Em programas complicados, uma classe ou objeto específicos podem

ser alocados de muitas maneiras diferentes. O número total de objetos não é tão

importante quanto identificar o código responsável por alocar os objetos que

estão com vazamento de memória.

O Python 3.4 introduziu um novo módulo nativo chamado tracemalloc para

resolver esse problema. tracemalloc possibilita relacionar um objeto com o local

em que foi alocado. No exemplo a seguir, usamos tracemalloc para mostrar na

tela os três maiores culpados de vazamento de memória em um programa:

# top_n.py

import tracemalloc

tracemalloc.start(10) # Reserva até 10 quadros na pilha

time1 = tracemalloc.take_snapshot()

import waste_memory

x = waste_memory.run()

time2 = tracemalloc.take_snapshot()

stats = time2.compare_to(time1, 'lineno')

for stat in stats[:3]:

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!