Zython - Cython
Entwickler | Robert Bradshaw, Stefan Behne et al. |
---|---|
Erstmals erschienen | 28. Juli 2007 |
Stabile Version | 0.29.21 (8. Juli 2020 [±] | )
Vorschauversion | 3.0a6 (31. Juli 2020 [±] | )
Implementierungssprache | Python |
Betriebssystem | Windows , MacOS , Linux |
Lizenz | Apache-Lizenz 2.0 |
Dateinamenerweiterungen | .pyx, .pxd, .pxi |
Webseite |
cython |
Beeinflusst von | |
C , Python |
Cython ist eine Programmiersprache, die darauf abzielt, eine Obermenge der Programmiersprache Python zu sein und C- ähnliche Leistung mit Code zu bieten, der hauptsächlich in Python mit optionaler zusätzlicher C-inspirierter Syntax geschrieben ist.
Cython ist eine kompilierte Sprache , die normalerweise zum Generieren von CPython- Erweiterungsmodulen verwendet wird. Annotierter Python-ähnlicher Code wird in C oder C++ kompiliert und dann automatisch in Schnittstellencode eingeschlossen , wodurch Erweiterungsmodule erzeugt werden, die von regulärem Python-Code mit der import-Anweisung geladen und verwendet werden können, jedoch mit deutlich weniger Rechenaufwand zur Laufzeit . Cython erleichtert auch das Einpacken von unabhängigem C- oder C++-Code in Python-importierbare Module.
Cython ist in Python und C geschrieben und funktioniert unter Windows , macOS und Linux und erzeugt Quelldateien, die mit CPython 2.6, 2.7 und 3.3 und späteren Versionen kompatibel sind.
Cython 3.0.0 ist in Entwicklung.
Entwurf
Cython arbeitet, indem es ein Standard-Python-Modul erstellt. Das Verhalten unterscheidet sich jedoch von Standard-Python darin, dass der ursprünglich in Python geschriebene Modulcode in C übersetzt wird. Der resultierende Code ist zwar schnell, führt jedoch viele Aufrufe an den CPython-Interpreter und die CPython-Standardbibliotheken durch, um die eigentliche Arbeit auszuführen. Die Wahl dieser Anordnung sparte Cython erheblich an Entwicklungszeit, aber Module haben eine Abhängigkeit vom Python-Interpreter und der Standardbibliothek.
Obwohl der größte Teil des Codes C-basiert ist, ist normalerweise ein kleiner Stub-Loader erforderlich, der in interpretiertem Python geschrieben ist (es sei denn, das Ziel besteht darin, einen vollständig in C geschriebenen Loader zu erstellen, was die Arbeit mit den undokumentierten Interna von CPython beinhalten kann). Dies ist jedoch aufgrund des Vorhandenseins des Python-Interpreters kein großes Problem.
Cython hat eine fremde Funktionsschnittstelle zum Aufrufen von C / C++- Routinen und die Fähigkeit, den statischen Typ von Unterprogrammparametern und -ergebnissen, lokalen Variablen und Klassenattributen zu deklarieren .
Ein Cython-Programm, das denselben Algorithmus wie ein entsprechendes Python-Programm implementiert, kann aufgrund von Unterschieden zwischen den CPython- und Cython-Ausführungsmodellen weniger Rechenressourcen wie etwa Kernspeicher und Verarbeitungszyklen verbrauchen. Ein grundlegendes Python-Programm wird von der virtuellen CPython- Maschine geladen und ausgeführt , sodass sowohl die Laufzeit als auch das Programm selbst Rechenressourcen verbrauchen. Ein Cython-Programm wird in C-Code kompiliert, der weiter in Maschinencode kompiliert wird, sodass die virtuelle Maschine nur kurz beim Laden des Programms verwendet wird.
Cython beschäftigt:
- Optimistische Optimierungen
- Typinferenz (optional)
- Geringer Overhead in Kontrollstrukturen
- Geringer Overhead für Funktionsaufrufe
Die Leistung hängt sowohl davon ab, welcher C-Code von Cython generiert wird, als auch davon, wie dieser Code vom C-Compiler kompiliert wird.
Geschichte
Cython ist ein Derivat der Pyrex-Sprache und unterstützt mehr Funktionen und Optimierungen als Pyrex. Cython wurde gegabelt aus Pyrex im Jahr 2007 von den Entwicklern der Sage Computer - Algebra - Paket, weil sie mit Pyrex Limitierungen unglücklich waren und nicht die Patches von Pyrex Maintainer Greg Ewing, der stellte sich einen viel kleineren Raum für sein Werkzeug als die Sage Entwickler hatte in akzeptierten könnte Verstand. Sie gaben dann Pyrex als SageX ab. Als sie feststellten, dass Leute Sage heruntergeladen haben, nur um SageX zu bekommen, und Entwickler anderer Pakete (einschließlich Stefan Behnel, der die XML- Bibliothek LXML betreut) auch Forks von Pyrex pflegten, wurde SageX vom Sage-Projekt abgespalten und mit cython-lxml
Cython fusioniert .
Cython-Dateien haben eine .pyx
Erweiterung. Im Grunde sieht Cython-Code genauso aus wie Python-Code. Während Standard-Python jedoch dynamisch typisiert ist , können in Cython optional Typen bereitgestellt werden, die eine verbesserte Leistung ermöglichen und es ermöglichen, Schleifen nach Möglichkeit in C-Schleifen zu konvertieren. Zum Beispiel:
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
Beispiel
Ein Beispiel- Hello-World- Programm für Cython ist komplexer als in den meisten Sprachen, da es mit der Python-C-API und der setuptools
Erweiterungsbaueinrichtung verbunden ist. Für ein Basisprojekt werden mindestens drei Dateien benötigt:
- Eine
setup.py
Datei zum Aufrufen dessetuptools
Buildprozesses, der das Erweiterungsmodul generiert - Ein Python-Hauptprogramm zum Laden des Erweiterungsmoduls
- Cython-Quelldatei(en)
Die folgenden Codeauflistungen veranschaulichen den Build- und Startprozess:
# 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"))
Diese Befehle erstellen und starten das Programm:
$ python setup.py build_ext --inplace
$ python launch.py
Verwendung im IPython/Jupyter-Notebook
Eine einfachere Möglichkeit, mit Cython zu beginnen, ist über die Befehlszeile von IPython (oder über die browserinterne Python-Konsole namens 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
was eine 95-fache Verbesserung gegenüber der reinen Python-Version ergibt. Weitere Details zum Thema auf der offiziellen Schnellstartseite.
Verwendet
Cython ist besonders bei wissenschaftlichen Python-Anwendern beliebt, wo es laut Python-Erfinder Guido van Rossum "das perfekte Publikum" hat . Besonders zu beachten:
- Die kostenlose Software SageMath Computer-Algebra-System hängt von Cython ab, sowohl für die Leistung als auch für die Schnittstelle zu anderen Bibliotheken.
- Wesentliche Teile der wissenschaftlichen Computerbibliotheken SciPy , pandas und scikit-learn sind in Cython geschrieben.
- Einige stark frequentierte Websites wie Quora verwenden Cython.
Cythons Domäne ist nicht nur auf numerisches Rechnen beschränkt. Das XML-Toolkit lxml ist beispielsweise hauptsächlich in Cython geschrieben, und wie sein Vorgänger Pyrex wird Cython verwendet, um Python-Bindungen für viele C- und C++-Bibliotheken wie die Messaging-Bibliothek ZeroMQ bereitzustellen . Cython kann auch verwendet werden, um parallele Programme für Mehrkernprozessormaschinen zu entwickeln ; Diese Funktion nutzt die OpenMP- Bibliothek.