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.

test = lambda: insertion_sort(data)

O Python tem dois profilers nativos, um escrito puramente em Python (profile) e

o outro que é um módulo em C (cProfile). O módulo nativo cProfile é melhor

porque causa um impacto muito ínfimo no desempenho de seu programa

enquanto está sendo analisado. A alternativa em Python puro coloca um fardo

tão grande no desempenho que pode até mesmo influenciar os resultados.

Nota

Ao traçar o perfil de um programa em Python, certifique-se de que está

medindo o desempenho apenas do código e não de sistemas externos. Esteja

atento para funções que acessem a rede ou recursos no disco. Tais funções

parecem ter grande impacto no tempo de execução do programa, mas quem é

lento de fato são os sistemas subjacentes. Se seu programa usa cache para

mascarar a latência de recursos vagarosos como esses, é também prudente

deixar o cache “encher” por alguns momentos antes de iniciar o processo de

determinação dos perfis de desempenho.

No exemplo a seguir, instanciamos um objeto Profile do módulo cProfile e

rodamos nele a função de teste usando o método runcall:

profiler = Profile()

profiler.runcall(test)

Uma vez que o teste tenha terminado, podemos extrair dados estatísticos sobre

seu desempenho usando o módulo nativo pstats, mais precisamente sua classe

Stats. Os muitos métodos de um objeto Stats permitem ajustar como selecionar e

ordenar as informações dos perfis coletados para mostrar apenas as que nos

interessam.

stats = Stats(profiler)

stats.strip_dirs()

stats.sort_stats('cumulative')

stats.print_stats()

A saída é uma tabela de informações organizada por função. A amostra de dados

é extraída somente durante o tempo de atividade do profiler, usando o método

runcall citado anteriormente.

>>>

20003 function calls in 1.812 seconds

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!