cython Samouczek
Pierwsze kroki z cytonem
Szukaj…
Uwagi
Co to jest Cython?
Język programowania Cython wzbogaca Python o pisanie statyczne podobne do C, możliwość bezpośredniego wywoływania funkcji C i kilka innych funkcji. Pozwala to osiągnąć wydajność na poziomie C przy jednoczesnym użyciu składni podobnej do języka Python.
Jak to działa?
Kod Cython jest kompilowany za pomocą kompilatora źródło-źródło cython w celu utworzenia kodu C lub C ++, który z kolei można skompilować za pomocą kompilatora C. Pozwala to tworzyć rozszerzenia, które można importować z Pythona lub plików wykonywalnych.
Główny wzrost wydajności, jaki Cython może osiągnąć w przeciwieństwie do czystego Pythona wynika z ominięcia interfejsu API CPython. Na przykład podczas dodawania dwóch liczb całkowitych Python wykonuje sprawdzenie typu dla każdej zmiennej, znajduje funkcję dodawania, która spełnia znalezione typy, i wywołuje tę funkcję. W kodzie C generowanym przez Cython typy są już znane i wykonuje się tylko jedno wywołanie funkcji. Dlatego też Cython świeci szczególnie w przypadku problemów matematycznych, w których typy są wyraźne.
Jak go użyć, aby przyspieszyć mój kod?
Częstym przypadkiem użycia przy próbie przyspieszenia programu przy użyciu Cython jest profilowanie kodu i przeniesienie kosztownych obliczeniowo części do skompilowanych modułów Cython. Pozwala to zachować składnię Pythona dla dużej części kodu i zastosować przyspieszenie tam, gdzie jest najbardziej potrzebne.
Instalowanie Cython
Aby użyć Cython, potrzebne są dwie rzeczy: sam pakiet Cython, który zawiera cython
źródło-źródło-Cython i interfejsy Cython do kilku bibliotek C i Python (na przykład numpy). Aby skompilować kod C generowany przez kompilator cython
, potrzebny jest kompilator C.
Krok 1: Instalowanie Cython
System agnostyczny
Cython można zainstalować z kilkoma systemami zarządzania pakietami agnostycznymi. Obejmują one:
PyPI przez pip lub easy_install:
$ pip install cython $ easy_install cython
anakonda za pomocą conda:
$ conda install cython
Enthought baldachim za pomocą menedżera pakietów enpkg:
$ enpkg cython
Również kod źródłowy można pobrać z github i zainstalować ręcznie za pomocą:
$ python setup.py install
Ubuntu, Debian
W przypadku Ubuntu dostępne są pakiety cython
i cython3
. Pamiętaj, że zapewniają one starszą wersję niż wymienione powyżej opcje instalacji.
$ apt-get install cython cython3
Windows
W systemie Windows plik .whl, który można zainstalować przy użyciu pip, jest dostarczany przez firmę zewnętrzną. Szczegółowe informacje na temat instalowania pliku .whl w systemie Windows można znaleźć tutaj .
Krok 2: Instalowanie kompilatora C.
Aby skompilować pliki C generowane przez Cython, potrzebny jest kompilator dla C i C ++. Kompilator gcc jest zalecany i można go zainstalować w następujący sposób.
Ubuntu, Debian
Pakiet build-essential
zawiera wszystko, co jest potrzebne. Można go zainstalować z repozytoriów za pomocą:
$ sudo apt-get install build-essential
PROCHOWIEC
Narzędzia programistyczne XCode zawierają kompilator podobny do gcc.
Windows
MinGW (Minimalistyczny GNU dla Windows) zawiera wersję gcc dla Windows. Można również użyć kompilatora Visual Studio.
Witaj świecie
Plik cython pyx musi zostać przetłumaczony na kod C ( cytonizowany ) i skompilowany, zanim będzie można go użyć z języka Python. Powszechnym podejściem jest tworzenie modułu rozszerzenia, który jest następnie importowany do programu w języku Python.
Kod
W tym przykładzie tworzymy trzy pliki:
-
hello.pyx
zawiera kod Cython. -
test.py
to skrypt w języku Python, który używa rozszerzenia hello. -
setup.py
służy do kompilacji kodu Cython.
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))
Kompilacja
Można to zrobić, używając cython hello.pyx
aby przetłumaczyć kod na C, a następnie skompilować go za pomocą gcc
. Łatwiejszym sposobem jest pozwolić destutils sobie z tym poradzić:
$ 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
Plik obiektu współdzielonego (.so) można zaimportować i wykorzystać z Pythona, dzięki czemu możemy teraz uruchomić test.py
:
$ python test.py
(23.0 ^ 2) + 23.0 = 552.0