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.
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.
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.
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.
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.
%%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.
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