Zoeken…


Opmerkingen

Wat is Cython?

De programmeertaal Cython verrijkt Python door C-achtig statisch typen, de mogelijkheid om C-functies direct aan te roepen en verschillende andere functies. Hiermee kunt u prestaties op C-niveau bereiken terwijl u nog steeds een Python-achtige syntaxis gebruikt.

Hoe werkt het?

Cython-code wordt gecompileerd met behulp van de cython source-to-source-compiler om C- of C ++ -code te maken, die op zijn beurt kan worden gecompileerd met een C-compiler. Hiermee kunt u extensies maken die kunnen worden geïmporteerd uit Python of uitvoerbare bestanden.

De belangrijkste prestatiewinst die Cython kan bereiken in tegenstelling tot pure Python-stammen komt door het omzeilen van de CPython API. Bij het toevoegen van twee gehele getallen voert Python bijvoorbeeld een typecontrole uit voor elke variabele, zoekt het een add-functie die voldoet aan de gevonden typen en roept die functie aan. In de door Cython gegenereerde C-code zijn de typen al bekend en wordt slechts één functieaanroep gedaan. Daarom schittert Cython vooral voor wiskundige problemen waarin de typen duidelijk zijn.

Hoe gebruik ik het om mijn code te versnellen?

Een veelvoorkomend geval bij het proberen om een programma met Cython te versnellen, is om de code te profileren en de rekenkundig dure onderdelen naar gecompileerde Cython-modules te verplaatsen. Hiermee kunt u de syntaxis van Python voor het grootste deel van de code behouden en de versnelling toepassen waar dit het meest nodig is.

Cython installeren

Om Cython te gebruiken zijn twee dingen nodig: het Cython-pakket zelf, dat de cython source-to-source compiler en Cython-interfaces naar verschillende C- en Python-bibliotheken (bijvoorbeeld numpy) bevat. Om de door de cython compiler gegenereerde C-code te compileren, is een C-compiler nodig.

Stap 1: Cython installeren

Systeem Agnostisch

Cython kan worden geïnstalleerd met verschillende systeem-agnostische pakketbeheersystemen. Waaronder:

  1. PyPI via pip of easy_install:

    $ pip install cython
    $ easy_install cython
    
  2. anaconda gebruikt conda:

    $ conda install cython
    
  3. Enthought luifel met behulp van de enpkg pakketmanager:

    $ enpkg cython
    

De broncode kan ook worden gedownload van github en handmatig worden geïnstalleerd met behulp van:

$ python setup.py install

Ubuntu, Debian

Voor Ubuntu zijn de pakketten cython en cython3 beschikbaar. Merk op dat deze een oudere versie bieden dan de hierboven genoemde installatie-opties.

$ apt-get install cython cython3

ramen

Voor Windows wordt een .whl-bestand dat met pip kan worden geïnstalleerd, geleverd door een derde partij. Details over het installeren van een .whl-bestand op Windows vindt u hier .


Stap 2: Een C-compiler installeren

Om de door Cython gegenereerde C-bestanden te compileren, is een compiler voor C en C ++ nodig. De gcc-compiler wordt aanbevolen en kan als volgt worden geïnstalleerd.

Ubuntu, Debian

Het build-essential pakket bevat alles wat nodig is. Het kan vanuit de repositories worden geïnstalleerd met behulp van:

$ sudo apt-get install build-essential

MAC

De XCode-ontwikkeltools bevatten een gcc-achtige compiler.

ramen

MinGW (Minimalistische GNU voor Windows) bevat een Windows-versie van gcc. De compiler van Visual Studio kan ook worden gebruikt.

Hallo Wereld

Een Cython pyx-bestand moet worden vertaald naar C-code ( cythonized ) en worden gecompileerd voordat het kan worden gebruikt vanuit Python. Een gebruikelijke aanpak is om een uitbreidingsmodule te maken die vervolgens wordt geïmporteerd in een Python-programma.

Code

Voor dit voorbeeld maken we drie bestanden:

  • hello.pyx bevat de Cython-code.
  • test.py is een Python-script dat de hello-extensie gebruikt.
  • setup.py wordt gebruikt om de Cython-code te compileren.

hello.pyx

from libc.math cimport pow

cdef double square_and_add (double x):
    """Compute x^2 + x as double.

    This is a cdef function that can be called from within
    a Cython program, but not from Python.
    """
    return pow(x, 2.0) + x

cpdef print_result (double x):
    """This is a cpdef function that can be called from Python."""
    print("({} ^ 2) + {} = {}".format(x, x, square_and_add(x)))

test.py

# Import the extension module hello.
import hello

# Call the print_result method 
hello.print_result(23.0)

setup.py

from distutils.core import Extension, setup
from Cython.Build import cythonize

# define an extension that will be cythonized and compiled
ext = Extension(name="hello", sources=["hello.pyx"])
setup(ext_modules=cythonize(ext))

Het compileren

Dit kan worden gedaan door cython hello.pyx te cython hello.pyx om de code naar C te vertalen en vervolgens te compileren met gcc . Een eenvoudigere manier is om distutils dit aan te laten:

$ ls
hello.pyx  setup.py  test.py
$ python setup.py build_ext --inplace
$ ls
build  hello.c  hello.cpython-34m.so  hello.pyx  setup.py  test.py

Het gedeelde object (.so) -bestand kan worden geïmporteerd en gebruikt vanuit Python, dus nu kunnen we de test.py :

$ python test.py
(23.0 ^ 2) + 23.0 = 552.0 


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow