Python ist keineswegs schnell, sondern langsam. Daher versucht Cython, durch Konvertierung in C / C ++ zu beschleunigen.
Es wird entschieden, schnell zu sein, da es in die niedrigere Sprache C / C ++ konvertiert wird (die früher eine Hochsprache war, jetzt aber als Niedrigsprache bezeichnet werden kann) und nativ kompiliert wird.
Sie könnten den Eindruck bekommen, dass ** "Cython ist schwierig" ** und ** "Cython erfordert Kenntnisse in C / C ++" **. Die Antwort ist ja" **.
Die Antwort basiert jedoch auf der vollständigen Nutzung von Cython. Tatsächlich ist Cython so konzipiert, dass Sie nicht viel über ** C / C ++ wissen müssen, um genügend Vorteile für eine kleine Beschleunigung ** zu erhalten.
Selbst wenn Sie Cython blind verwenden, erhalten Sie enttäuschende Ergebnisse wie "nicht sehr schnell" und "sehr schwer zu migrieren". Basierend auf den hier beschriebenen Punkten soll dieser Artikel Anfängern, die nicht mit C / C ++ vertraut sind, ermöglichen, die köstlichen Teile von Cython aufzunehmen und zu essen.
In diesem Artikel wird nicht erläutert, wie Cython installiert oder setup.py geschrieben wird. Wenn Sie es bei Google nachschlagen, wird es bald veröffentlicht. Bitte suchen Sie.
Cython unter Windows verfügbar machen.
In diesem Artikel werde ich nicht auf den tiefen Teil von Cython eingehen, sondern köstliches Essen aufgreifen und essen, und ich werde den tiefen Teil von Cython nicht erklären. Zum Glück lesen Sie bitte den folgenden Artikel, wenn Sie den tiefen Teil von Cython kennenlernen möchten, bei dem es sich um eine japanische Übersetzung der Cython-Dokumentation handelt.
Cython-Dokument (japanische Übersetzung)
Nur weil die Verarbeitungsgeschwindigkeit schneller ist, sollte sie in diesem Fall nicht beschleunigt werden, sondern es kann gesagt werden, dass es nur wenige Stellen gibt, an denen die Beschleunigung mit Cython effektiv ist.
Die Ausführungsgeschwindigkeit eines Programms wird nicht nur durch die einfache Verarbeitungsgeschwindigkeit bestimmt. Das einzige, was durch eine Verbesserung der Verarbeitungsgeschwindigkeit verbessert werden kann, ist das Warten (CPU-gebunden) aufgrund vieler arithmetischer Verarbeitungen, das Warten auf Speicherzugriff (speichergebunden), das Warten auf das Lesen von Daten von der Festplatte usw. (E / A-gebunden) usw. Hat wenig Wirkung. Diese Probleme sollten durch Verbesserung des Algorithmus (z. B. Memorandum) und Threading / Multi-Processing behoben werden.
Die Beschleunigung mit Cython ist einfacher als die Portierung auf C / C ++, aber dennoch aufwändig. Es macht oft wenig Sinn, hart zu arbeiten, um das gesamte Programm zu beschleunigen. Es ist viel effizienter, eine 1000-mal aufgerufene Funktion um 1% zu beschleunigen, als eine nur einmal aufgerufene Funktion um 10% zu beschleunigen.
Die beiden oben genannten Punkte sind die Grundprinzipien und der gesunde Menschenverstand für die Beschleunigung. Das Wichtigste ist nicht, das gesamte Programm zu beschleunigen, sondern die Ursachen und Orte von Engpässen zu verstehen und geeignete Maßnahmen zu ergreifen. Paradoxerweise ist die Verarbeitungsgeschwindigkeit der Sprache nicht so wichtig, die Verbesserung des Algorithmus ist wichtiger und das Problem der Ausführungsgeschwindigkeit kann in den meisten Fällen durch Verbesserung des Algorithmus gelöst werden.
Abhängig von der Ursache des Engpasses sind SWIG oder Numba möglicherweise besser geeignet. Verwenden Sie daher die richtige Person am richtigen Ort.
Python-Looping ist langsam. Dies liegt daran, dass zum Zeitpunkt der Schleife verschiedene Überprüfungen durchgeführt werden, da verschiedene Typen im Array gespeichert werden können. Selbst wenn Sie schnelles Numpy verwenden, wird durch Drehen des Arrays mit for die Geschwindigkeit drastisch verringert, und es ist eine Faustregel, die Schleifenverarbeitung bei Verwendung von Numpy zu vermeiden.
Aufgrund des Freiheitsgrades aufgrund der dynamisch typisierten Sprache ist für jede Operation eine Überprüfung des Variablentyps enthalten. Sogar eine einfache Operation, "a + b", muss die "add" -Methode durchlaufen, die für jede Operation Overhead verursacht.
Funktionsaufrufe sind nicht auf Python beschränkt, sondern verursachen einen erheblichen Overhead. Insbesondere dynamisch typisierte Sprachen haben einen größeren Overhead als statisch typisierte Sprachen, da die Typprüfung auch bei der Zuweisung zum Stapel durchgeführt wird.
Jupyter ist der beste Weg, um Cython zu implementieren. Cython unterstützt Jupyters magischen Befehl, sodass Sie ihn problemlos auf Jupyter ausprobieren können.
Geben Sie auf Jupyter den folgenden Befehl ein, um Cython zu aktivieren.
%load_ext Cython
Experimentieren wir mit der Anzahl der Fibonacci, die jeder liebt. Erstellen Sie zunächst in Python eine Python-Funktion, die die Fibonacci-Nummer findet.
def py_fib(n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
return a
Geschwindigkeitsmessung
%timeit py_fib(1000)
>>> 10000 loops, best of 3: 66.9 µs per loop
Geben Sie als Nächstes zu Beginn den magischen Befehl "%% cython" ein, um eine Funktion zu erstellen, die genau den gleichen Inhalt wie die vorherige Python-Funktion hat. Auch hier ist der Inhalt genau der gleiche wie der von Python, nur der Funktionsname ist unterschiedlich.
%%cython
def cy_fib(n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
return a
Geschwindigkeitsmessung
%timeit cy_fib(1000)
>>> 100000 loops, best of 3: 16 µs per loop
Nur durch Ändern der Python-Funktion in Cython stieg sie von 66,9 µs auf 16 µs, was mehr als viermal schneller ist, ohne etwas zu tun. Cython ist ziemlich kompatibel mit der Python-Syntax, und Cython konvertiert es so wie es ist in C / C ++, es sei denn, es ist zu spezieller Python-Code.
Geben Sie den Typ an, um ihn noch schneller zu machen.
%%cython
def cy_fib2(int n):
a, b = 0.0, 1.0
for i in range(n):
a, b = a + b, a
return a
Geschwindigkeitsmessung
%timeit cy_fib2(1000)
>>> 1000000 loops, best of 3: 1.11 µs per loop
66,9 µs → 1,11 µs, was 60-mal schneller ist.
Wichtig hierbei ist, dass nur der Teil `def cy_fin2 (int n)`
typdefiniert ist, ansonsten entspricht er genau der Python-Funktion.
Tatsächlich führt Cython eine Typinferenz durch und konvertiert automatisch die Variablen "a" und "b" in einen Doppeltyp und die Variable "i" in einen Int-Typ. Selbst wenn der Python-Code so eingefügt wird, wie er ist, verhält er sich so weit wie möglich vom ursprünglichen Python-Code und wird in C / C ++ konvertiert, um die Leistung nicht zu beeinträchtigen.
In Cython ist ** blindes Tippen nicht sehr sinnvoll, da es nur die Lesbarkeit verringert **. In den meisten Fällen können Sie durch einfaches Eingeben einiger Variablen das Zehnfache schneller erreichen.
Wenn Sie "%% cython -a" eingeben und ausführen, werden sowohl Python als auch C / C ++ und die Zeilen, deren Verarbeitung lange dauert, gelb angezeigt.
Die legitime Verwendung von Cython besteht darin, den Python-Code zu kopieren und einzufügen, ohne darüber nachzudenken, und vorzugsweise die gelben Linien einzugeben.
Zusammenfassend sind die Teile, die zur Beschleunigung optimiert werden müssen, nur einige Funktionen im Programmcode, und nur wenige Zeilen dieser Funktionen sollten von Cython optimiert werden. Daher versucht Cython, dies unter Beibehaltung der Lesbarkeit leicht zu erreichen.
Cython wird oft als schwierig angesehen, aber dank der Bemühungen der Cython-Entwickler ist es fast perfekt mit Python kompatibel. Wenn Sie teilweise beschleunigen möchten, können Sie ohne Kenntnis von C / C ++ genügend Vorteile erzielen. (In 99% der Fälle wird das Ziel erreicht, wenn einige Funktionen beschleunigt werden.)
~~ Cython ist sehr tiefgreifend, und ich werde eine weitere Gelegenheit nutzen, um zu erklären, wie man es benutzt. ~~
Fahren Sie fort mit Einführung in Cython, ohne tief zu gehen -2-.
Recommended Posts