Profilers de memória e cpu

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:

  1. Qual biblioteca é usada para verificar o consumo de memória de um programa Python?

    • a) memory_profiler
    • b) cProfile
    • c) line_profiler
    • d) timeit
  2. 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
  3. 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
<< Benchmark Índice Widgets >>