[PYTHON] Déplaçons Cython et Numba facilement

Contour

numba est un module qui exécute Python en utilisant le compilateur JIT (juste à temps), Cython est un langage de programmation qui peut être écrit comme Python mais pré-compilé comme C / C ++.

Je vais le déplacer pour le moment

Voici le traitement sur le bloc-notes Jupyter.

Anaconda, python 3.7.3 est utilisé.

Dans le code qui génère le nième de la séquence de Fibonacci, comparons la vitesse avec python, numba, cython et cython typé.

Tout d'abord, python ordinaire

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

Mesurons le temps nécessaire pour calculer le 1000ème nombre dans la séquence de Fibonacci avec le module timeit.

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

Il semble que cela ait pris 33,6 microsecondes en moyenne.

Dans ce cas, la commande% timeit effectue le traitement suivant.

Le nombre de boucles (10000 boucles dans ce cas) est automatiquement ajusté par la fonction de «% timeit», et change en fonction de la vitesse d'exécution du code à mesurer.

Une fois compilé avec Numba

numba peut être installé avec pip.

pip install numba

Utiliser numba est très simple, il suffit d'ajouter un décorateur @ jit.

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

Mesurez le temps de traitement.

%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 microsecondes! C'est 26 fois plus rapide.

Lors de l'utilisation de Cython

Dans jupyter, cython peut être chargé avec la commande magique suivante.

%load_ext Cython

La compilation et l'optimisation se font en mettant %% cython en premier.

%%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 microsecondes. C'est environ quatre fois plus rapide sans rien faire.

Enfin, lors de la compilation avec cython après avoir spécifié le type.

%%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 microsecondes! 34 fois plus rapide.

finalement

S'il s'agit d'un processus simple comme celui ci-dessus, il est facile de le déplacer avec numba ou cython, mais s'il s'agit d'un processus compliqué, il y aura des cas où il ne peut pas être géré.

Si vous voulez de la vitesse, vous voudrez peut-être passer à une autre langue dès que possible, ou envisager une sélection multi-processus ou matériel.

Recommended Posts

Déplaçons Cython et Numba facilement
Je ne peux pas passer facilement à Python3, alors pensons à la compatibilité 2-3
Déplaçons word2vec avec Chainer et voyons la progression de l'apprentissage
Utilisons Python Janome facilement
Utilisons le wordcloud de python facilement!