Python ist eine Sprache, die viele Programmierer lieben. Diese Sprache ist unglaublich einfach zu bedienen. Die Sache ist, dass der in Python geschriebene Code intuitiv und gut lesbar ist. In Gesprächen über Python kann man jedoch oft die gleiche Beschwerde über diese Sprache hören. Besonders wenn C-Experten über Python sprechen. So klingt es: "Python ist langsam." Und diejenigen, die dies sagen, sündigen nicht gegen die Wahrheit.
Im Vergleich zu vielen anderen Programmiersprachen ist Python in der Tat langsam.
Hier sind die Testergebnisse, die die Leistung verschiedener Programmiersprachen bei der Lösung verschiedener Probleme vergleichen.

Es gibt verschiedene Möglichkeiten, Python-Programme zu beschleunigen. Beispielsweise können Sie
Bibliotheken verwenden, die für die Verwendung mehrerer Prozessorkerne ausgelegt sind. Wer mit Numpy, Pandas oder Scikit-Learn arbeitet, kann sich das
Rapids- Softwarepaket ansehen, mit dem Sie die GPU für wissenschaftliche Berechnungen verwenden können.
Alle diese Beschleunigungstechniken eignen sich für Fälle, in denen die mit Python zu lösenden Aufgaben parallelisiert werden können. Dies sind beispielsweise Aufgaben für die vorläufige Datenverarbeitung oder Operationen mit Matrizen.
Aber was ist, wenn Ihr Code reines Python ist? Was ist, wenn Sie eine große
for
Schleife haben, die Sie unbedingt verwenden müssen und deren Ausführung einfach nicht parallelisiert werden kann, da die darin verarbeiteten Daten nacheinander verarbeitet werden müssen? Gibt es eine Möglichkeit, Python selbst zu beschleunigen?
Die Antwort auf diese Frage gibt Cython - ein Projekt, mit dem Sie in Python geschriebenen Code erheblich beschleunigen können.
Was ist Cython?
Cython ist im Kern eine Zwischenschicht zwischen Python und C / C ++. Mit Cython können Sie regulären Python-Code mit einigen geringfügigen Änderungen schreiben, der dann direkt in C-Code übersetzt wird.
Die einzige Änderung am Python-Code besteht darin, jeder Variablen Informationen zu ihrem Typ hinzuzufügen. Wenn Sie normalen Python-Code schreiben, können Sie eine Variable wie folgt deklarieren:
x = 0.5
Wenn Sie Cython beim Deklarieren einer Variablen verwenden, müssen Sie deren Typ angeben:
cdef float x = 0.5
Dieses Konstrukt teilt Cython mit, dass die Variable eine Gleitkommazahl ist. Nach dem gleichen Prinzip werden Variablen in C deklariert. Mit normalem Python werden Variablentypen dynamisch definiert. Die in Cython verwendete explizite Typdeklaration ermöglicht die Konvertierung von Python-Code in C-Code. Der Punkt ist, dass in C eine explizite Deklaration von Variablentypen erforderlich ist.
Die Installation von Cython ist äußerst einfach:
pip install cython
Typen in Cython
Bei Verwendung von Cython können zwei Arten von Typen unterschieden werden. Eine ist für Variablen, die zweite für Funktionen.
Wenn es sich um Variablen handelt, stehen uns folgende Typen zur Verfügung:
cdef int a, b, c
cdef char *s
cdef float x = 0.5
(Zahl mit einfacher Genauigkeit)cdef double x = 63.4
(doppelte Genauigkeit)cdef list names
cdef dict goals_for_each_play
cdef object card_deck
Bitte beachten Sie, dass hier tatsächlich C / C ++ - Typen angezeigt werden!
Bei der Arbeit mit Funktionen stehen uns folgende Typen zur Verfügung:
def
ist eine reguläre Python-Funktion, die nur von Python aufgerufen wird.cdef
ist eine Cython-Funktion, die nicht aus regulärem Python-Code aufgerufen werden kann. Solche Funktionen können nur innerhalb des Cython-Codes aufgerufen werden.cpdef
- Eine Funktion, auf die sowohl von C als auch von Python aus zugegriffen werden kann.
Nachdem wir die Python-Typen herausgefunden haben, werden wir die Geschwindigkeit des Python-Codes nutzen.
Beschleunigen des Codes mit Cython
Beginnen wir mit der Erstellung eines Python-Benchmarks. Dies ist eine
for
Schleife, in der die Fakultät einer Zahl berechnet wird. Der entsprechende reine Python-Code würde folgendermaßen aussehen:
def test(x): y = 1 for i in range(1, x+1): y *= i return y
Das Cython-Äquivalent dieser Funktion ist der Originalversion sehr ähnlich. Der entsprechende Code muss in einer Datei mit der Erweiterung
.pyx
. Die einzige Änderung, die am Code vorgenommen werden muss, besteht darin, Informationen zu den Variablentypen und Funktionen hinzuzufügen:
cpdef int test(int x): cdef int y = 1 cdef int i for i in range(1, x+1): y *= i return y
Beachten Sie, dass der Funktion das Schlüsselwort
cpdef
ist. Auf diese Weise können Sie diese Funktion von Python aus aufrufen. Zusätzlich wird der Typ der Variablen
i
, die die Rolle eines Schleifenzählers spielt. Vergessen wir nicht, dass wir alle in der Funktion deklarierten Variablen eingeben müssen. Dadurch wird dem C-Compiler mitgeteilt, welche Typen verwendet werden sollen.
Erstellen Sie nun die
setup.py
, mit deren Hilfe wir den Cython-Code in C-Code konvertieren können:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('run_cython.pyx'))
Lassen Sie uns kompilieren:
python setup.py build_ext --inplace
Der C-Code ist jetzt einsatzbereit.
Wenn Sie sich den Ordner ansehen, in dem sich der Cython-Code befindet, finden Sie dort alle Dateien, die zum Ausführen des C-Codes erforderlich sind, einschließlich der Datei
run_cython.c
. Wenn Sie interessiert sind, öffnen Sie diese Datei und sehen Sie sich an, welchen C-Code Cython generiert.
Jetzt können Sie unseren ultraschnellen C-Code testen. Unten finden Sie den Code zum Testen und Vergleichen von zwei Versionen des Programms.
import run_python import run_cython import time number = 10 start = time.time() run_python.test(number) end = time.time() py_time = end - start print("Python time = {}".format(py_time)) start = time.time() run_cython.test(number) end = time.time() cy_time = end - start print("Cython time = {}".format(cy_time)) print("Speedup = {}".format(py_time / cy_time))
Dieser Code ist sehr einfach. Wir importieren die erforderlichen Dateien - genau wie reguläre Python-Dateien importiert werden, und rufen dann die entsprechenden Funktionen auf, so als würden wir die ganze Zeit mit regulären Python-Funktionen arbeiten.
Schauen Sie sich die folgende Tabelle an. Möglicherweise stellen Sie fest, dass die Cython-Version des Programms in allen Fällen schneller ist als die Python-Version. Je größer die Aufgabe, desto größer die Beschleunigung, die Cython bietet.
Zusammenfassung
Die Verwendung von Cython kann fast jeden in Python geschriebenen Code ohne besonderen Aufwand erheblich beschleunigen. Je mehr Schleifen im Programm vorhanden sind und je mehr Daten verarbeitet werden, desto bessere Ergebnisse können Sie von Cython erwarten.
Liebe Leser! Verwenden Sie Cython in Ihren Projekten?
