"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Otimizando código Python usando módulo cProfile e PyPy: um guia completo

Otimizando código Python usando módulo cProfile e PyPy: um guia completo

Publicado em 2024-11-07
Navegar:992

Optimizing Python Code Using cProfile and PyPy module: A Complete Guide

Introdução

Como desenvolvedores Python, muitas vezes nos concentramos em fazer nosso código funcionar antes de nos preocuparmos em otimizá-lo. No entanto, ao lidar com aplicações de grande escala ou códigos de desempenho crítico, a otimização torna-se crucial. Nesta postagem, abordaremos duas ferramentas poderosas que você pode usar para otimizar seu código Python: o módulo cProfile e o interpretador PyPy.

Ao final desta postagem, você aprenderá:

  1. Como identificar gargalos de desempenho usando o módulo cProfile.
  2. Como otimizar seu código para velocidade.
  3. Como usar PyPy para acelerar ainda mais seus programas Python com compilação Just-in-Time (JIT).

Por que a otimização de desempenho é importante

Python é conhecido por sua facilidade de uso, legibilidade e vasto ecossistema de bibliotecas. Mas também é mais lento que algumas outras linguagens como C ou Java devido à sua natureza interpretada. Portanto, saber como otimizar seu código Python pode ser fundamental em aplicações sensíveis ao desempenho, como modelos de aprendizado de máquina, sistemas em tempo real ou sistemas de negociação de alta frequência.

A otimização normalmente segue estas etapas:

  1. Perfil do seu código para entender onde estão os gargalos.
  2. Otimize o código em áreas que são ineficientes.
  3. Execute o código otimizado em um interpretador mais rápido, como PyPy, para obter desempenho máximo.

Agora, vamos começar criando o perfil do seu código.

Etapa 1: traçando o perfil do seu código com cProfile

O que é cProfile?

cProfile é um módulo Python integrado para criação de perfil de desempenho. Ele rastreia quanto tempo cada função do seu código leva para ser executada, o que pode ajudá-lo a identificar as funções ou seções do código que estão causando lentidão.

Usando cProfile na linha de comando

A maneira mais simples de criar o perfil de um script é executando cProfile na linha de comando. Por exemplo, digamos que você tenha um script chamado my_script.py:

python -m cProfile -s cumulative my_script.py

Explicação:

  • -m cProfile: executa o módulo cProfile como parte da biblioteca padrão do Python.
  • -s cumulativo: classifica os resultados do perfil por tempo acumulado gasto em cada função.
  • my_script.py: Seu script Python.

Isso gerará um detalhamento detalhado de onde seu código está gastando seu tempo.

Exemplo: Criando perfil de um script Python

Vejamos um script Python básico que calcula números de Fibonacci recursivamente:

def fibonacci(n):
    if n 



Executando este script com cProfile:

python -m cProfile -s cumulative fibonacci_script.py

Compreendendo a saída do cProfile

Depois de executar o cProfile, você verá algo assim:

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     8320    0.050    0.000    0.124    0.000 fibonacci_script.py:3(fibonacci)

Cada coluna fornece dados importantes de desempenho:

  • ncalls: Número de vezes que a função foi chamada.
  • tottime: Tempo total gasto na função (excluindo subfunções).
  • cumtime: Tempo cumulativo gasto na função (incluindo subfunções).
  • por chamada: Tempo por chamada.

Se sua função Fibonacci levar muito tempo, este resultado mostrará onde concentrar seus esforços de otimização.

Criação de perfil de partes específicas do seu código

Você também pode usar cProfile programaticamente em seu código se desejar apenas criar perfis de seções específicas.

import cProfile

def fibonacci(n):
    if n 



Etapa 2: otimizando seu código Python

Depois de identificar os gargalos em seu código usando cProfile, é hora de otimizar.

Técnicas comuns de otimização Python

  1. Usar funções integradas: Funções integradas como sum(), min() e max() são altamente otimizadas em Python e geralmente são mais rápidas do que loops implementados manualmente.

Exemplo:

   # Before: Custom sum loop
   total = 0
   for i in range(1000000):
       total  = i

   # After: Using built-in sum
   total = sum(range(1000000))
  1. Evite chamadas de função desnecessárias: Chamadas de função têm sobrecarga, especialmente dentro de loops. Tente reduzir chamadas redundantes.

Exemplo:

   # Before: Unnecessary repeated calculations
   for i in range(1000):
       print(len(my_list))  # len() is called 1000 times

   # After: Compute once and reuse
   list_len = len(my_list)
   for i in range(1000):
       print(list_len)
  1. Memoização: Para funções recursivas, você pode usar a memorização para armazenar resultados de cálculos caros para evitar trabalho repetido.

Exemplo:

   from functools import lru_cache

   @lru_cache(maxsize=None)
   def fibonacci(n):
       if n 



Isso acelera bastante o cálculo de Fibonacci, armazenando os resultados de cada chamada recursiva.

Etapa 3: usando PyPy para compilação Just-in-Time

O que é PyPy?

PyPy é um interpretador Python alternativo que usa compilação Just-in-Time (JIT) para acelerar seu código Python. O PyPy compila caminhos de código executados com frequência em código de máquina, tornando-o muito mais rápido do que o interpretador CPython padrão para determinadas tarefas.

Instalando PyPy

Você pode instalar o PyPy usando um gerenciador de pacotes como apt no Linux ou brew no macOS:

# On Ubuntu
sudo apt-get install pypy3

# On macOS (using Homebrew)
brew install pypy3

Executando código Python com PyPy

Depois que o PyPy estiver instalado, você poderá executar seu script com ele em vez do CPython:

pypy3 my_script.py

Por que usar o PyPy?

  • PyPy é ideal para tarefas vinculadas à CPU onde o programa passa a maior parte do tempo em computação (por exemplo, loops, funções recursivas, processamento de números).
  • O compilador JIT do PyPy otimiza os caminhos de código que são executados com mais frequência, o que pode resultar em acelerações significativas sem quaisquer alterações de código.

Etapa 4: Combinando cProfile e PyPy para otimização máxima

Agora, vamos combinar essas ferramentas para otimizar totalmente seu código Python.

Exemplo de fluxo de trabalho

  1. Perfil do seu código usando cProfile para identificar gargalos.
  2. Otimize seu código usando as técnicas que discutimos (integrações, memorização, evitando chamadas de função desnecessárias).
  3. Execute seu código otimizado com PyPy para obter melhorias adicionais de desempenho.

Vamos revisitar nosso exemplo de Fibonacci e juntar tudo.

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n 



Depois de otimizar o código com memoização, execute-o usando PyPy para obter mais melhorias de desempenho:

pypy3 fibonacci_script.py

Conclusão

Ao aproveitar cProfile e PyPy, você pode otimizar bastante seu código Python. Use cProfile para identificar e resolver gargalos de desempenho em seu código. Em seguida, use o PyPy para aumentar ainda mais a velocidade de execução do seu programa por meio da compilação JIT.

Resumindo:

  1. Perfil do seu código com cProfile para entender os gargalos de desempenho.
  2. Aplique técnicas de otimização Python, como uso de recursos integrados e memoização.
  3. Execute o código otimizado no PyPy para obter um desempenho ainda melhor.

Com essa abordagem, você pode fazer com que seus programas Python sejam executados de maneira mais rápida e eficiente, especialmente para tarefas vinculadas à CPU.

Conecte-se comigo:
Github
Linkedin

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/usooldatascience/optimizing-python-code-using-cprofile-and-pypy-module-a-complete-guide-4779?1 Se houver alguma violação, entre em contato com study_golang @163.com excluir
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3