Cython - Cython

Cython
Cython-logo.svg
Desenvolvedor Robert Bradshaw, Stefan Behnel, et al.
Apareceu pela primeira vez 28 de julho de 2007 ; 14 anos atras ( 28/07/2007 )
Versão estável 0.29.21 (8 de julho de 2020 ; 14 meses atrás ) [±] ( 2020-07-08 )
Versão de visualização 3.0a6 (31 de julho de 2020 ; 13 meses atrás ) [±] ( 2020-07-31 )
Linguagem de implementação Pitão
SO WindowsMacOSLinux
Licença Licença Apache 2.0
Extensões de nome de arquivo .pyx, .pxd, .pxi
Local na rede Internet cython .org Edite isso no Wikidata
Influenciado por
C , Python

Cython é uma linguagem de programação que pretende ser um superconjunto da linguagem de programação Python , projetada para fornecer desempenho semelhante ao C com código que é escrito principalmente em Python com sintaxe adicional opcional inspirada em C.

Cython é uma linguagem compilada que normalmente é usada para gerar módulos de extensão CPython . O código anotado do tipo Python é compilado para C ou C ++ e então automaticamente empacotado no código da interface , produzindo módulos de extensão que podem ser carregados e usados ​​pelo código Python regular usando a instrução import, mas com significativamente menos sobrecarga computacional em tempo de execução . Cython também facilita o empacotamento de código C ou C ++ independente em módulos importáveis ​​de Python.

Cython é escrito em Python e C e funciona em Windows , macOS e Linux , produzindo arquivos de origem compatíveis com CPython 2.6, 2.7 e 3.3 e versões posteriores.

Cython 3.0.0 está em desenvolvimento.

Projeto

Cython funciona produzindo um módulo Python padrão. No entanto, o comportamento difere do Python padrão porque o código do módulo, originalmente escrito em Python, é traduzido para C. Embora o código resultante seja rápido, ele faz muitas chamadas para o interpretador CPython e bibliotecas padrão CPython para realizar o trabalho real. A escolha desse arranjo economizou consideravelmente no tempo de desenvolvimento do Cython, mas os módulos dependem do interpretador Python e da biblioteca padrão.

Embora a maior parte do código seja baseado em C, um pequeno carregador de stub escrito em Python interpretado é geralmente necessário (a menos que o objetivo seja criar um carregador escrito inteiramente em C, o que pode envolver trabalho com os componentes internos não documentados de CPython). No entanto, este não é um grande problema devido à presença do interpretador Python.

Cython tem uma interface de função estrangeira para invocar rotinas C / C ++ e a capacidade de declarar o tipo estático de parâmetros e resultados de sub-rotina, variáveis ​​locais e atributos de classe.

Um programa Cython que implementa o mesmo algoritmo que um programa Python correspondente pode consumir menos recursos de computação, como memória central e ciclos de processamento devido às diferenças entre os modelos de execução CPython e Cython. Um programa Python básico é carregado e executado pela máquina virtual CPython , de modo que tanto o tempo de execução quanto o próprio programa consomem recursos de computação. Um programa Cython é compilado em código C, que é posteriormente compilado em código de máquina, de modo que a máquina virtual é usada apenas brevemente quando o programa é carregado.

Cython emprega:

  • Otimizações otimistas
  • Inferência de tipo (opcional)
  • Baixa sobrecarga em estruturas de controle
  • Baixa sobrecarga de chamada de função

O desempenho depende de qual código C é gerado pelo Cython e como esse código é compilado pelo compilador C.

História

Cython é um derivado da linguagem Pyrex e oferece suporte a mais recursos e otimizações do que o Pyrex. Cython foi bifurcado do Pyrex em 2007 por desenvolvedores do pacote de álgebra computacional Sage , porque eles estavam insatisfeitos com as limitações do Pyrex e não conseguiram que os patches fossem aceitos pelo mantenedor do Pyrex, Greg Ewing, que imaginou um escopo muito menor para sua ferramenta do que os desenvolvedores do Sage tinham em mente. Em seguida, eles bifurcaram o Pyrex como SageX. Quando eles descobriram que as pessoas estavam baixando o Sage apenas para obter o SageX, e os desenvolvedores de outros pacotes (incluindo Stefan Behnel, que mantém a biblioteca XML LXML) também estavam mantendo forks do Pyrex, o SageX foi separado do projeto Sage e fundido cython-lxmlpara se tornar Cython.

Os arquivos Cython têm uma .pyxextensão. Em sua forma mais básica, o código Cython se parece exatamente com o código Python. No entanto, enquanto o Python padrão é digitado dinamicamente , no Cython, os tipos podem ser fornecidos opcionalmente, permitindo um desempenho aprimorado, permitindo que os loops sejam convertidos em loops C quando possível. Por exemplo:

def primes(int kmax):  # The argument will be converted to int or raise a TypeError.
    cdef int n, k, i  # These variables are declared with C types.
    cdef int p[1000]  # Another C type
    result = []  # A Python type
    if kmax > 1000:
        kmax = 1000
    k = 0
    n = 2
    while k < kmax:
        i = 0
        while i < k and n % p[i] != 0:
            i = i + 1
        if i == k:
            p[k] = n
            k = k + 1
            result.append(n)
        n = n + 1
    return result

Exemplo

Hello World em Cython

Um programa hello world de amostra para Cython é mais complexo do que na maioria das linguagens porque faz interface com a API C do Python e o setuptoolsrecurso de construção de extensão. São necessários pelo menos três arquivos para um projeto básico:

  • Um setup.pyarquivo para invocar o setuptoolsprocesso de construção que gera o módulo de extensão
  • Um programa python principal para carregar o módulo de extensão
  • Arquivo (s) de origem do Cython

As seguintes listagens de código demonstram o processo de criação e inicialização:

# hello.pyx - Python module, this code will be translated to C by Cython.
def say_hello():
    print("Hello World!")
# launch.py - Python stub loader, loads the module that was made by Cython.

# This code is always interpreted, like normal Python.
# It is not compiled to C.

import hello
hello.say_hello()
# setup.py - unnecessary if not redistributing the code, see below
from setuptools import setup
from Cython.Build import cythonize

setup(name = "Hello world app",
      ext_modules = cythonize("*.pyx"))

Esses comandos criam e iniciam o programa:

$ python setup.py build_ext --inplace
$ python launch.py

Usando em notebook IPython / Jupyter

Uma maneira mais direta de começar com o Cython é por meio do IPython da linha de comando (ou do console Python no navegador chamado Jupyter notebook ):

In [1]: %load_ext Cython

In [2]: %%cython
   ...: def f(n):
   ...:     a = 0
   ...:     for i in range(n):
   ...:         a += i
   ...:     return a
   ...: 
   ...: cpdef g(int n):
   ...:     cdef long a = 0
   ...:     cdef int i
   ...:     for i in range(n):
   ...:         a += i
   ...:     return a
   ...: 

In [3]: %timeit f(1000000)
10 loops, best of 3: 26.5 ms per loop

In [4]: %timeit g(1000000)
1000 loops, best of 3: 279 µs per loop

o que dá uma melhoria de 95 vezes em relação à versão python pura. Mais detalhes sobre o assunto na página oficial de início rápido.

Usos

Cython é particularmente popular entre os usuários científicos do Python, onde tem "o público perfeito" de acordo com o criador do Python, Guido van Rossum . Em particular:

  • O sistema de álgebra computacional SageMath de software livre depende do Cython, tanto para desempenho quanto para interface com outras bibliotecas.
  • Partes significativas das bibliotecas de computação científica SciPy , pandas e scikit-learn são escritas em Cython.
  • Alguns sites de alto tráfego, como o Quora, usam o Cython.

O domínio de Cython não se limita apenas à computação numérica. Por exemplo, o kit de ferramentas XML lxml é escrito principalmente em Cython e, como seu predecessor Pyrex, Cython é usado para fornecer ligações Python para muitas bibliotecas C e C ++, como a biblioteca de mensagens ZeroMQ . Cython também pode ser usado para desenvolver programas paralelos para máquinas com processador multi-core ; este recurso faz uso da biblioteca OpenMP .

Veja também

Referências

links externos