[PYTHON] Eine Einführung in Cython, ohne tief zu gehen

Was ist Cython?

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.

Zweck dieses Artikels

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 nicht erklärt

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)

Fälle, in denen es besser ist, nicht mit Cython zu beschleunigen

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.

Andere Beschleunigung als CPU-gebunden

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.

Beschleunigen Sie alle Programme

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.

Mit anderen Worten, es gibt nur einen kleinen Teil des Ganzen, der beschleunigt werden sollte.

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.

Code zur Verbesserung mit Cython

Schleifenverarbeitung

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.

Arithmetische Verarbeitung

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.

Funktionsaufruf

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.

Cython beginnend mit Jupyter (IPython)

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.

cython.png

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.

Zusammenfassung

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

Eine Einführung in Cython, ohne tief zu gehen
Einführung in Cython ohne tief zu gehen -2-
Einführung in Word2Vec, die auch Katzen verstehen können
Einführung in das Schreiben von Cython [Notizen]
Einführung in Private TensorFlow
Einführung in Deep Learning ~ Lernregeln ~
Eine Einführung in die Python-Programmierung
Einführung in die Bayes'sche Optimierung
Tiefe Stärkung des Lernens 1 Einführung in die Stärkung des Lernens
Einführung in Deep Learning ~ Backpropagation ~
[Einführung in StyleGAN] Dieser "Mann, der nicht lacht" lächelte ungewollt ♬
Einführung in Python, die auch Affen verstehen können (Teil 3)
Einführung in Python, die auch Affen verstehen können (Teil 1)
Einführung in Python, die auch Affen verstehen können (Teil 2)
Eine Einführung in Mercurial für Nicht-Ingenieure
Einführung in das tiefe Lernen ~ Funktionsnäherung ~
Einführung in Deep Learning ~ Codierungsvorbereitung ~
Einführung in Deep Learning ~ Dropout Edition ~
Einführung in Deep Learning ~ Forward Propagation ~
Einführung in Deep Learning ~ CNN Experiment ~
Erste Schritte mit Python für Nicht-Ingenieure
[Python Tutorial] Eine einfache Einführung in Python
Eine Einführung in Pandas, um zu lernen, während man leidet [Teil 1]
Einführung in Deep Learning ~ Falten und Pooling ~
Eine Einführung in OpenCV für maschinelles Lernen
Rekursives neuronales Netzwerk: Eine Einführung in RNN
Eine Einführung in Python für maschinelles Lernen
Eine Einführung in die Objektorientierung - Geben Sie einem Objekt ein Kind.
Eine Einführung in Python für C-Sprachprogrammierer
Einführung in Deep Learning (1) --Chainer wird Anfängern leicht verständlich erklärt.
Was ist ein Algorithmus? Einführung in den Suchalgorithmus] ~ Python ~
Eine Einführung in maschinelles Lernen für Bot-Entwickler
Eine Einführung in die objektorientierte Programmierung für Anfänger von Anfängern
Ein Amateur versuchte Deep Learning mit Caffe (Einführung)
Eine Einführung in die statistische Modellierung für die Datenanalyse
Einführung in Deep Learning ~ Lokalisierungs- und Verlustfunktion ~
Einführung in Python "Re" 1 Erstellen einer Ausführungsumgebung
Eine Einführung in die Sprachanalyse für Musik-Apps
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in Scrapy (4)
Einführung in discord.py (2)
Einführung in die verteilte Parallelverarbeitung von Python durch Ray
Lesehinweis: Einführung in die Datenanalyse mit Python
So erstellen Sie einen HTTPS-Server mit Go / Gin
So stellen Sie eine Go-Anwendung auf einer ECS-Instanz bereit
Einführung in das maschinelle Lernen mit Simple Perceptron