Zython - Cython

Cython
Cython-logo.svg
Entwickler Robert Bradshaw, Stefan Behne et al.
Erstmals erschienen 28. Juli 2007 ; Vor 14 Jahren ( 2007-07-28 )
Stabile Version 0.29.21 (8. Juli 2020 ; vor 14 Monaten ) [±] ( 2020-07-08 )
Vorschauversion 3.0a6 (31. Juli 2020 ; vor 13 Monaten ) [±] ( 2020-07-31 )
Implementierungssprache Python
Betriebssystem Windows , MacOS , Linux
Lizenz Apache-Lizenz 2.0
Dateinamenerweiterungen .pyx, .pxd, .pxi
Webseite cython .org Bearbeite dies bei Wikidata
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-lxmlCython fusioniert .

Cython-Dateien haben eine .pyxErweiterung. 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

Hallo Welt in Cython

Ein Beispiel- Hello-World- Programm für Cython ist komplexer als in den meisten Sprachen, da es mit der Python-C-API und der setuptoolsErweiterungsbaueinrichtung verbunden ist. Für ein Basisprojekt werden mindestens drei Dateien benötigt:

  • Eine setup.pyDatei zum Aufrufen des setuptoolsBuildprozesses, 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.

Siehe auch

Verweise

Externe Links