cython Handledning
Komma igång med cython
Sök…
Anmärkningar
Vad är Cython?
Cython-programmeringsspråket berikar Python med C-liknande statisk typ, möjligheten att direkt ringa C-funktioner och flera andra funktioner. Detta gör det möjligt att nå prestanda på C-nivå medan du fortfarande använder en Python-liknande syntax.
Hur fungerar det?
Cython-kod kompileras med hjälp av cython-källan-till-källkompilatorn för att skapa C- eller C ++ -kod, som i sin tur kan kompileras med en C-kompilator. Detta gör det möjligt att skapa tillägg som kan importeras från Python eller körbara filer.
Den huvudsakliga prestationsförstärkningen Cython kan nå i motsats till ren Python härrör från att kringgå CPython API. När du till exempel lägger till två heltal utför Python en typkontroll för varje variabel, hittar en tilläggsfunktion som uppfyller de hittade typerna och anropar den funktionen. I den Cython-genererade C-koden är typerna redan kända och endast ett funktionsanrop görs. Därför lyser Cython särskilt för matematiska problem där typerna är tydliga.
Hur använder jag den för att påskynda min kod?
Ett vanligt användningsfall, när man försöker påskynda ett program med Cython, är att profilera koden och flytta de beräkningsbara dyra delarna till sammanställda Cython-moduler. Detta gör det möjligt att behålla Python-syntax för huvuddelen av koden och tillämpa speedupen där den är mest nödvändig.
Installera Cython
För att använda Cython behövs två saker. Själva Cython-paketet, som innehåller cython
källan-till-källkompileraren och Cython-gränssnitt till flera C- och Python-bibliotek (till exempel numpy). För att sammanställa C-koden genererad av cython
kompilatorn cython
en C-kompilator.
Steg 1: Installera Cython
System Agnostic
Cython kan installeras med flera systemagnostiska pakethanteringssystem. Dessa inkluderar:
PyPI via pip eller easy_install:
$ pip install cython $ easy_install cython
anaconda med conda:
$ conda install cython
Tänkte kapell med enpkg-pakethanteraren:
$ enpkg cython
Källkoden kan också laddas ner från github och installeras manuellt med:
$ python setup.py install
Ubuntu, Debian
För Ubuntu är paketen cython
och cython3
tillgängliga. Observera att dessa ger en äldre version än de ovan angivna installationsalternativen.
$ apt-get install cython cython3
Windows
För Windows tillhandahålls en .whl-fil som kan installeras med pip från en tredje part. Detaljer om installation av en .whl-fil på Windows kan hittas här .
Steg 2: Installera en C-kompilator
För att kompilera C-filer som genereras av Cython behövs en kompilator för C och C ++. Gcc-kompilatorn rekommenderas och kan installeras enligt följande.
Ubuntu, Debian
Det build-essential
paketet innehåller allt som behövs. Det kan installeras från förvaren med:
$ sudo apt-get install build-essential
MAC
XCode-utvecklarverktygen innehåller en gcc-liknande kompilator.
Windows
MinGW (Minimalistisk GNU för Windows) innehåller en Windows-version av gcc. Kompilatorn från Visual Studio kan också användas.
Hej världen
En Cython pyx-fil måste översättas till C-kod ( cytoniserad ) och sammanställas innan den kan användas från Python. En vanlig metod är att skapa en tilläggsmodul som sedan importeras i ett Python-program.
Koda
För det här exemplet skapar vi tre filer:
-
hello.pyx
innehåller Cython-koden. -
test.py
är ett Python-skript som använder hejtillägget. -
setup.py
används för att sammanställa Cython-koden.
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))
sammanställa
Detta kan göras genom att använda cython hello.pyx
att översätta koden till C och sedan kompilera den med gcc
. Ett enklare sätt är att låta distutiler hantera detta:
$ 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
Den delade objekt (.so) -filen kan importeras och användas från Python, så nu kan vi köra test.py
:
$ python test.py
(23.0 ^ 2) + 23.0 = 552.0