Python, uma linguagem de programação versátil e poderosa, é a escolha ideal para desenvolvedores em várias áreas, incluindo inteligência artificial. Independentemente da área em que você atua, otimizar seus códigos Python para velocidade é crucial.
A criação de perfis (profiling) é um processo que envolve a análise do tempo de execução de códigos para identificar gargalos e áreas que devem ser melhoradas. Especificamente para códigos Python, otimizar suas velocidades é muitas vezes uma prioridade máxima. Isso é particularmente importante para o desenvolvimento de aplicativos que exigem execuções rápidas, como processamento de dados em tempo real ou computação de alto desempenho.
Como descobrir o desempenho de seus códigos Python?
Use ferramentas de profiling para analisar seus códigos e identificar o tempo de execução de suas operações e seus desempenhos.
A criação de perfis deve orientar seus esforços de otimização para áreas que produzirão as melhorias mais significativas no desempenho. Portanto, se concentre em otimizar os gargalos identificados em vez de tentar otimizar todo o código de uma só vez. E lembre-se: o erro mais comum em profiling é a interpretação inadequada dos dados.
Quais são as melhores ferramentas de profiling para Python?
Existem várias ferramentas e técnicas que podem ser usadas para a análise de desempenho de códigos Python. Veja alguns exemplos abaixo.
Profilers
cProfile
Este é um módulo interno e robusto do Python para realizar profiling determinístico de códigos. Ele pode ser usado para análises detalhadas de um script inteiro ou de funções específicas. Porém, ele não é ideal para aplicações em tempo real. Ou seja, ele deve ser usada na fase de desenvolvimento de suas aplicações.
# exemplo de como pode ser usado
import cProfile
# sua função aqui
def minha_func():
# seu bloco de código aqui
cProfile.run('minha_func()')
line_profiler
Precisa ser instalado com pip. Inspeciona o desempenho de um código linha por linha. Esse é um método ideal para identificar linhas lentas específicas dentro das funções. Ele é usado como um decorator.
# para instalar
pip install line-profiler
# exemplo de como pode ser usado
from line_profiler import LineProfiler
profiler = LineProfiler()
@profiler
def minha_func():
# seu bloco de código aqui
profiler.print_stats()
Funções de Temporização
Avaliar a complexidade de tempo de seus códigos é crucial para entender seus desempenhos. Ferramentas como o módulo time e timeit são ideais para essa tarefa.
timeit
O principal objetivo do módulo timeit é fornecer uma maneira conveniente de medir o tempo de execução de pequenos trechos de código. Ele é adequado para medir partes de código de execução curta. O timeit é perfeito para realizar comparações de desempenho de diferentes abordagens como, por exemplo, loops e vetorização.
import timeit
init = timeit.default_timer()
# seu bloco de código aqui
fim = timeit.default_timer()
print(f'tempo de execução: {fim - init}')
time
import time
init = time.time()
# seu bloco de código aqui
fim = time.time()
print(f'tempo de execução: {fim - init}')
Ferramentas de Visualização
Ferramentas como snakeviz, Pyinstrument e py-spy geram representações gráficas de dados de profiling. Isso facilita bastante a visualização de gargalos e a identificação de áreas que precisam de otimização.
O snakeviz, por exemplo, pode ser usado em combinação com o cProfile. Nesse caso, o cProfile é utilizado para gerar um arquivo .prof que o snakeviz usa para criar uma representação gráfica do perfil do código. Veja um exemplo abaixo.
# para instalar
pip install snakeviz
# para criar o arquivo .prof
import cProfile
import pstats
import io
# adicione sua função
def minha_func():
# seu bloco de código aqui
return res # retorno opcional
# inicializa perfil
pr = cProfile.Profile()
pr.enable()
res = minha_func()
pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s).sort_stats('tottime')
ps.print_stats()
# cria arquivo .prof
filename = 'meu_arquivo.prof'
ps.dump_stats(filename)
# para rodar snakeviz - digite no terminal
snakeviz meu_arquivo.prof