Cython

Programmiersprache
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 28. Mai 2010 um 22:24 Uhr durch Scoder (Diskussion | Beiträge). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Cython ist eine universelle Programmiersprache, die weitgehend zu Python kompatibel ist. Wie diese unterstützt es verschiedene Programmierparadigmen wie objektorientierte, aspektorientierte und funktionale Programmierung. Der Hauptvorteil liegt jedoch in der Übersetzung in die Zielsprache C, was sowohl eine hohe Performance im Vergleich zum Standard-Python-Interpreter erlaubt, als auch eine direkte Interaktion mit externem Code ermöglicht, der in C, C++ oder Fortran geschrieben ist.

Cython
Basisdaten
Paradigmen: multiparadigmatisch
Erscheinungsjahr: 2007
Entwickler: Robert Bradshaw, Stefan Behnel, et al.
Aktuelle Version: 0.12.1  (02. Februar 2010)
Typisierung: stark, statisch, dynamisch („Duck-Typing“)
Beeinflusst von: Python, C
Betriebssystem: Linux, Unix-ähnliches System, Microsoft Windows[1], macOS[1]
Lizenz: Apache-Lizenz, Version 2.0[2], Apache-Lizenz[3]
cython.org

Haupteinsatzgebiete sind die Anbindung von externen Bibliotheken an den CPython-Interpreter, sowie die Beschleunigung von Python-Code, insbesondere in numerischen Berechnungen.

Der generierte Code ist nicht autark, sondern benötigt eine CPython Laufzeitumgebung. Dabei wird sowohl die Generierung von Binärmodulen ("Extension-Modul") unterstützt, die dynamisch über den 'import'-Befehl in den Python-Interpreter geladen werden können, als auch die Linker-Integration des CPython-Interpreters in das generierte Modul, so dass ein ausführbares Programm entsteht ("Embedding").

Entwicklungsgeschichte

Cython basiert auf Pyrex von Greg Ewing. Im Juli 2007 wurde der Cython Compiler durch Robert Bradshaw und Stefan Behnel als eigenständiges, offen entwickeltes Projekt von Pyrex abgespalten. Seitdem wurde versucht, die beiden Compiler weitgehend kompatibel zu halten, wobei jedoch Cython wesentlich weitreichendere Optimierungen anwendet und eine höhere Kompatibilität mit Python-Code erreicht. Einige wichtige Unterschiede zu Pyrex sind im Cython-Wiki beschrieben.

Namensherkunft

Der Name Cython ist eine Namenszusammenfassung der beiden zugrunde liegenden Programmiersprachen: Python und C. Die englische Aussprache erinnert zudem an das Zischen einer Schlange, eine Anspielung an Stärke und Angriffslust einer Python, die einem optimierenden Compiler gut zu Gesicht stehen.

Ziele

Das Cython-Projekt hat sich zum Ziel gesetzt, einen Compiler für Python-Code zu entwickeln (Ziel für Version 1.0), der durch zusätzliche (explizite) statische Typisierung eine möglichst hohe Performance und eine weitreichende Integration mit Code bietet, der in C, C++ und Fortran geschrieben ist.

Cython ist ein optimierender Compiler, jedoch nicht im gängigen Sinne eines Compilers der Binärcode erzeugt. Vielmehr erlaubt es die Übersetzung in C-Code, viele grundlegende Optimierungen und Plattform-Anpassungen einem C-Compiler zu überlassen. So kann sich der Cython-Compiler selbst auf High-Level-Optimierungen auf AST-Ebene beschränken.

Der C-Code, den Cython generiert, ist weitgehend portabel bezüglich Plattformen (Prozessor, C-Compiler und Betriebsystem) und CPython-Versionen. Aktuell (Cython 0.12.x) werden alle CPython Versionen ab Python 2.3 unterstützt, inklusive Python 3.0, 3.1.x und den Vorabversionen von Python 2.7 und 3.2. Getestete Plattformen sind unter Anderem MacOS-X, Microsoft Windows und vor allem verschiedene Linux Distributionen, mit 32bit und 64bit Systemversionen.

Spracheigenschaften

Die Kombination von Python und C erlaubt Cython ein sehr breites Anforderungsspektrum abzubilden. Möglich ist sowohl High-Level-Programmierung mit Python-Datentypen, -Sprachkonstrukten und automatischer Speicherverwaltung, als auch eine sehr C-nahe Programmierung mit C-Datentypen, C-Funktionen und manueller Speicherverwaltung. Beides kann beliebig kombiniert werden, was bei der Optimierung von Cython-Code ein sehr feingranulares Vorgehen ermöglicht. Dadurch unterstützt Cython sehr gut das Prinzip, dass der größte Teil der Laufzeit eines Programms in einem sehr kleinen Teil des Source-Codes entsteht, also die Optimierung eines kleinen Programmteils einen sehr großen Performance-Gewinn bringen kann, während bei dem größten Teil des Codes eine hohe Entwicklungsgeschwindigkeit und ein geringer Wartungsaufwand wichtiger sind als eine größtmögliche Ausführungsgeschwindigkeit.

Viele der Optimierungen, die der Cython-Compilers automatisch durchführt, bewirken eine Spezialisierung des generierten C-Codes. Dazu verwendet der Compiler explizite statische Typdeklarationen und Typinferenz, um spezialisierten C-Code für die verwendeten Datentypen zu erzeugen.

Die Programmiersprache erreicht die Sprachintegration zwischen Python und C vor allem über Datentypen. So können verschiedene Python-Sprachkonstrukte sowohl auf Python-Datentypen als auch auf C-Datentypen angewendet werden. Ein Beispiel ist die 'for'-Schleife, die in Python eine Foreach-Schleife ist, also über beliebige iterierbare Container laufen kann (z.B. Listen oder Dateien). In Cython kann diese Schleife zudem über C-Arrays und Teilarrays laufen, sowie über Pointer-Abschnitte (Slices, z.B. ptr[2:8] für die Offsets 2-7). Ein großer Teil der Optimierungen im Cython-Compiler bezieht sich auf Schleifen, da sich hier zumeist ein großer Teil der Gesamtlaufzeit ansammelt.

Anwendungsgebiete

Die wichtigsten Anwendungsgebiete von Cython sind die Anbindung von externen Bibliotheken an den CPython-Interpreter, sowie die Beschleunigung von Python-Code, insbesondere in numerischen Berechnungen.

Beispielsweise basiert das Computeralgebrasystem Sage zu einem großen Teil auf Cython-Code. Dieser dient sowohl zur Implementierung mathematischer Algorithmen, als auch zu Anbindung externed Codes in C, C++ und Fortran. Cython unterstützt zudem eine sehr effiziente Interaktion mit NumPy-Matrizen, was darauf basierende Berechnungen stark vereinfacht.

  1. a b docs.cython.org.
  2. github.com. (abgerufen am 2. Februar 2020).
  3. Cython: C-Extensions for Python. (abgerufen am 8. Juli 2018).