Para entender como os recursos de memória e CPU são usados pelos nossos programas Python, é essencial analisar o desempenho e identificar possíveis ineficiências. Nesta fase do livro, vamos explorar os perfis de memória e CPU e aprender a utilizar ferramentas práticas para otimizar nossos códigos Python.
Para isso, vamos usar as bibliotecas memory_profiler
e cProfile
que são muito úteis na análise de desempenho e no diagnóstico de problemas de performance.
Instalando ferramentas de profiling
Primeiro, precisamos instalar as bibliotecas necessárias. Abrimos o terminal e executamos os seguintes comandos:
pip install memory_profiler
pip install line_profiler
Uso do Memory Profiler
A biblioteca memory_profiler
permite que vejamos quanto de memória é consumida pelo nosso código ao longo da sua execução. Vejamos como podemos usá-la num exemplo prático.
Exemplo Prático: Verificação do Consumo de Memória
Vamos criar uma função simples que cria uma lista grande e analisar o seu consumo de memória:
from memory_profiler import profile
@profile
def cria_lista_grande(n):
lista = [i for i in range(n)]
return lista
if __name__ == "__main__":
cria_lista_grande(1000000)
Para executar essa análise, usamos o seguinte comando no terminal:
python -m memory_profiler nome_do_ficheiro.py
A saída mostrará o consumo de memória antes e depois da criação da lista, permitindo-nos identificar possíveis pontos de ineficiência.
Uso do cProfile
Enquanto memory_profiler
foca no uso de memória, cProfile
analisa a utilização da CPU, fornecendo informações detalhadas sobre quanto tempo o programa gasta em cada função.
Exemplo Prático: Verificação do Uso da CPU
Vamos analisar o desempenho de uma função que calcula fatorial de um número:
import cProfile
def calcula_fatorial(n):
if n == 0:
return 1
else:
return n * calcula_fatorial(n-1)
if __name__ == "__main__":
cProfile.run('calcula_fatorial(20)')
Esse código vai mostrar detalhadamente quanto tempo cada chamada de função levou e quantas vezes foi chamada.
Melhoramentos Potenciais
Analisando os resultados, podemos optar por otimizar a função, por exemplo, usando uma abordagem iterativa em vez de recursiva:
def calcula_fatorial_iterativo(n):
fatorial = 1
for i in range(1, n + 1):
fatorial *= i
return fatorial
if __name__ == "__main__":
cProfile.run('calcula_fatorial_iterativo(20)')
Resumo
Neste capítulo, abordamos técnicas para analisar o consumo de memória e a utilização da CPU em programas Python utilizando as bibliotecas memory_profiler
e cProfile
. Com exemplos práticos, aprendemos a identificar e resolver ineficiências nos nossos códigos.
Quiz
Teste o seu conhecimento com as seguintes questões:
-
Qual biblioteca é usada para verificar o consumo de memória de um programa Python?
- a)
memory_profiler
- b)
cProfile
- c)
line_profiler
- d)
timeit
- a)
-
Para que serve a biblioteca
cProfile
?- a) Analisar o uso de memória
- b) Gerir dependências
- c) Analisar a utilização da CPU
- d) Melhorar a segurança do código
-
Qual das seguintes opções pode ser um indicador de ineficiência num programa Python?
- a) Alto consumo de memória
- b) Longos tempos de execução
- c) Múltiplas chamadas desnecessárias de função
- d) Todas as anteriores