[PYTHON] Lassen Sie uns Cython und Numba leicht bewegen

Gliederung

numba ist ein Modul, das Python mit dem JIT-Compiler (just-in-time) ausführt. Cython ist eine Programmiersprache, die wie Python geschrieben, aber wie C / C ++ vorkompiliert werden kann.

Ich werde es vorerst verschieben

Das Folgende ist die Verarbeitung auf dem Jupyter Notebook.

Anaconda, Python 3.7.3 wird verwendet.

Vergleichen wir in dem Code, der das n-te der Fibonacci-Sequenz generiert, die Geschwindigkeit mit Python, Numba, Cython und typisiertem Cython.

Zuallererst gewöhnliche Python

def python_fib(n):
    a, b = 0., 1.
    for i in range(n):
        a, b = a + b, a
    return a

Messen wir die Zeit, die erforderlich ist, um die 1000. Zahl in der Fibonacci-Sequenz mit dem Modul "timeit" zu berechnen.

%timeit python_fib(1000)
10000 loops, best of 3: 33.6 µs per loop

Es scheint, dass es durchschnittlich 33,6 Mikrosekunden gedauert hat.

In diesem Fall führt der Befehl% timeit die folgende Verarbeitung durch.

Die Anzahl der Schleifen (in diesem Fall 10000 Schleifen) wird automatisch durch die Funktion "% timeit" angepasst und ändert sich entsprechend der Ausführungsgeschwindigkeit des zu messenden Codes.

Bei Kompilierung mit Numba

numba kann mit pip installiert werden.

pip install numba

Die Verwendung von numba ist sehr einfach. Fügen Sie einfach einen "@ jit" -Dekorator hinzu.

from numba import jit

@jit
def numba_fib(n):
    a, b = 0.0, 1.0
    for i in range(n):
        a, b = a + b, a
    return a

Verarbeitungszeit messen.

%timeit numba_fib(1000)
The slowest run took 77684.24 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.26 µs per loop

1,26 Mikrosekunden! Es ist 26 mal schneller.

Bei Verwendung von Cython

In Jupyter kann Cython mit dem folgenden magischen Befehl geladen werden.

%load_ext Cython

Das Kompilieren und Optimieren erfolgt, indem %% cython an die erste Stelle gesetzt wird.

%%cython
def cython_fib(n):
    a, b = 0.0, 1.0
    for i in range(n):
        a, b = a + b, a
    return a
%timeit cython_fib(1000)
100000 loops, best of 3: 8.22 µs per loop

8,22 Mikrosekunden. Es ist ungefähr viermal schneller, ohne etwas zu tun.

Schließlich beim Kompilieren mit Cython nach Angabe des Typs.

%%cython
def cython_fib2(int n):
    a, b = 0., 1.
    for i in range(n):
        a, b = a + b, a
    return a
%timeit cython_fib2(1000)
The slowest run took 7.27 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 984 ns per loop

0,984 Mikrosekunden! 34 mal schneller.

Schließlich

Wenn es sich um einen einfachen Prozess wie den oben genannten handelt, ist es einfach, ihn mit Numba oder Cython zu verschieben. Wenn es sich jedoch um einen komplizierten Prozess handelt, gibt es Fälle, in denen er nicht behandelt werden kann.

Wenn Sie Geschwindigkeit wünschen, möchten Sie möglicherweise so schnell wie möglich zu einer anderen Sprache wechseln oder eine Auswahl für mehrere Prozesse oder Hardware in Betracht ziehen.

Recommended Posts

Lassen Sie uns Cython und Numba leicht bewegen
Ich kann nicht einfach zu Python3 wechseln, also lassen Sie uns über 2-3 Kompatibilität nachdenken
Lassen Sie uns word2vec mit Chainer verschieben und den Lernfortschritt sehen
Lassen Sie uns Python Janome einfach verwenden
Verwenden wir einfach die Wortwolke von Python!