Python é uma linguagem que muitos programadores adoram. Essa linguagem é incrivelmente fácil de usar. O problema é que o código escrito em Python é intuitivo e de boa legibilidade. No entanto, nas conversas sobre Python, muitas vezes é possível ouvir a mesma reclamação sobre essa linguagem. Especialmente quando especialistas em C estão falando sobre Python. É assim que soa: "Python é lento". E aqueles que dizem isso não pecam contra a verdade.
Comparado a muitas outras linguagens de programação, o Python é realmente lento.
Aqui estão os resultados dos testes que comparam o desempenho de diferentes linguagens de programação na solução de vários problemas.

Existem várias maneiras de acelerar os programas Python. Por exemplo, você pode usar
bibliotecas projetadas para usar vários núcleos de processador. Aqueles que trabalham com Numpy, Pandas ou Scikit-Learn podem ser aconselhados a dar uma olhada no pacote de software
Rapids , que permite usar a GPU em cálculos científicos.
Todas essas técnicas de aceleração são boas nos casos em que as tarefas que podem ser resolvidas usando o Python podem ser paralelizadas. Por exemplo, essas são tarefas para processamento de dados preliminares ou operações com matrizes.
Mas e se o seu código for puro Python? E se você tiver um loop
for
grande que você absolutamente deve usar, e cuja execução simplesmente não pode ser paralelizada devido ao fato de que os dados processados nele devem ser processados sequencialmente? Existe alguma maneira de acelerar o próprio Python?
A resposta a esta pergunta é dada pelo Cython - um projeto usando o qual você pode acelerar significativamente o código escrito em Python.
O que é o Cython?
Cython, em sua essência, é uma camada intermediária entre Python e C / C ++. O Cython permite escrever código Python regular com algumas pequenas modificações, que são traduzidas diretamente no código C.
A única alteração no código Python é adicionar informações sobre seu tipo a cada variável. Ao escrever código Python regular, você pode declarar uma variável como esta:
x = 0.5
Ao usar o Cython ao declarar uma variável, você precisa especificar seu tipo:
cdef float x = 0.5
Essa construção informa ao Cython que a variável é um número de ponto flutuante. Pelo mesmo princípio, as variáveis são declaradas em C. Usando Python comum, os tipos de variáveis são definidos dinamicamente. A declaração de tipo explícita usada no Cython é o que torna possível converter o código Python em código C. O ponto é que, em C, é necessária uma declaração explícita dos tipos de variáveis.
A instalação do Cython é extremamente simples:
pip install cython
Tipos em Cython
Ao usar o Cython, dois conjuntos de tipos podem ser distinguidos. Um é para variáveis, o segundo é para funções.
Se estamos falando de variáveis, os seguintes tipos estão disponíveis para nós:
cdef int a, b, c
cdef char *s
cdef float x = 0.5
(número de precisão único)cdef double x = 63.4
(número de precisão dupla)cdef list names
cdef dict goals_for_each_play
cdef object card_deck
Observe que aqui, de fato, os tipos C / C ++ são mostrados!
Ao trabalhar com funções, os seguintes tipos estão disponíveis para nós:
def
é uma função regular do Python, chamada apenas do Python.cdef
é uma função Cython que não pode ser chamada a partir de código Python comum. Tais funções só podem ser chamadas dentro do código Cython.cpdef
- Uma função que pode ser acessada a partir de C e Python.
Agora que descobrimos os tipos de Python, aumentaremos a velocidade do código Python.
Acelerando o código usando o Cython
Vamos começar criando um benchmark Python. Este será um loop
for
no qual o fatorial de um número é calculado. O código Python puro correspondente ficaria assim:
def test(x): y = 1 for i in range(1, x+1): y *= i return y
O equivalente cython dessa função é muito semelhante à sua versão original. O código correspondente deve ser colocado em um arquivo com a extensão
.pyx
. A única alteração que precisa ser feita no código é adicionar informações sobre os tipos de variáveis e funcionar nele:
cpdef int test(int x): cdef int y = 1 cdef int i for i in range(1, x+1): y *= i return y
Observe que a função tem a palavra-chave
cpdef
antes dela. Isso permite que você chame essa função do Python. Além disso, o tipo é atribuído à variável
i
, que desempenha o papel de um contador de loop. Não vamos esquecer que precisamos digitar todas as variáveis declaradas na função. Isso permitirá que o compilador C saiba quais tipos usar.
Agora crie o
setup.py
, que nos ajudará a converter o código Cython em código C:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('run_cython.pyx'))
Vamos compilar:
python setup.py build_ext --inplace
O código C está pronto para uso.
Se você olhar para a pasta na qual o código Cython está localizado, poderá encontrar todos os arquivos necessários para executar o código C, incluindo o arquivo
run_cython.c
. Se você estiver interessado, abra esse arquivo e veja o código C gerado pelo Cython.
Agora você está pronto para testar nosso código C ultra-rápido. Abaixo está o código usado para testar e comparar duas versões do programa.
import run_python import run_cython import time number = 10 start = time.time() run_python.test(number) end = time.time() py_time = end - start print("Python time = {}".format(py_time)) start = time.time() run_cython.test(number) end = time.time() cy_time = end - start print("Cython time = {}".format(cy_time)) print("Speedup = {}".format(py_time / cy_time))
Este código é muito simples. Importamos os arquivos necessários - assim como os arquivos regulares do Python são importados e, em seguida, chamamos as funções correspondentes, da mesma maneira como se trabalhassemos com as funções regulares do Python o tempo todo.
Veja a tabela a seguir. Você pode perceber que a versão Cython do programa é mais rápida que a versão Python em todos os casos. Quanto maior a tarefa, maior a aceleração que o Cython fornece.
Sumário
O uso do Cython pode acelerar significativamente quase qualquer código escrito em Python, sem fazer nenhum esforço especial. Quanto mais loops no programa e mais dados ele processa, melhores resultados você pode esperar do Cython.
Caros leitores! Você usa Cython em seus projetos?
