cython Zelfstudie
Aan de slag met cython
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:
PyPI via pip of easy_install:
$ pip install cython $ easy_install cython
anaconda gebruikt conda:
$ conda install cython
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