[PYTHON] Une introduction à Cython sans aller plus loin

Qu'est-ce que Cython?

Python n'est en aucun cas rapide, mais plutôt lent. Par conséquent, Cython essaie d'accélérer en convertissant en C / C ++.

Il est décidé d'être rapide car il est converti en langage inférieur C / C ++ (qui était autrefois un langage de haut niveau, mais maintenant il peut être appelé un langage de bas niveau) et compilé nativement.

Objectif de cet article

Vous pourriez avoir l'impression que ** "Cython est difficile" ** et ** "Cython nécessite des connaissances en C / C ++" **. La réponse est oui" **.

Cependant, la réponse est basée sur l'utilisation complète de Cython. En fait, Cython est conçu pour que vous n'ayez pas besoin d'en savoir beaucoup sur ** C / C ++ pour obtenir suffisamment d'avantages pour un peu d'accélération **.

Cependant, même si vous utilisez Cython à l'aveugle, vous obtiendrez des résultats décevants tels que «pas très rapide» et «très difficile à migrer». Sur la base des points ici, le but de cet article est de permettre aux débutants qui ne sont pas familiarisés avec C / C ++ de prendre et de manger les délicieuses parties de Cython.

Non expliqué dans cet article

Cet article n'explique pas comment installer Cython ou comment écrire setup.py. Si vous le recherchez sur Google, il sortira bientôt, alors veuillez rechercher.

Rendre Cython disponible sur Windows.

Dans cet article, je n'aborderai pas la partie profonde de Cython, mais pour ramasser et manger de la nourriture délicieuse, et je n'expliquerai pas la partie profonde de Cython. Heureusement, si vous voulez connaître la partie profonde de Cython, qui est une traduction japonaise de la documentation de Cython, veuillez vous référer à l'article ci-dessous.

Document Cython (traduction japonaise)

Cas où il vaut mieux ne pas accélérer avec Cython

Tout simplement parce que la vitesse de traitement est plus rapide, elle ne devrait pas être accélérée si cela se produit, mais on peut plutôt dire qu'il y a peu d'endroits où l'accélération est efficace avec Cython.

Accélération autre que liée au processeur

La vitesse d'exécution d'un programme n'est pas uniquement déterminée par la simple vitesse de traitement. La seule chose qui peut être améliorée en améliorant la vitesse de traitement est l'attente (liée au processeur) en raison de nombreux traitements arithmétiques, l'attente d'un accès à la mémoire (liée à la mémoire), l'attente de la lecture des données sur le disque dur, etc. (liées aux E / S), etc. A peu d'effet. Ces problèmes doivent être résolus en améliorant l'algorithme (comme le mémorandum) et le threading / multi-processing.

Accélérez tous les programmes

L'accélération avec Cython est plus facile que le portage vers C / C ++, mais elle reste lourde. Cela n'a souvent pas beaucoup de sens de travailler dur pour accélérer l'ensemble du programme. Il est beaucoup plus efficace d'accélérer une fonction appelée 1000 fois de 1% que d'accélérer une fonction appelée une seule fois de 10%.

En d'autres termes, il n'y a qu'une petite partie de l'ensemble qui devrait être accélérée.

Les deux points ci-dessus sont les principes de base et le bon sens de l'accélération. L'important n'est pas d'accélérer l'ensemble du programme, mais de ** comprendre les causes et les emplacements des goulots d'étranglement et de prendre les mesures appropriées **. Paradoxalement, la vitesse de traitement du langage n'est pas si importante, l'amélioration de l'algorithme est plus importante, et le problème de la vitesse d'exécution peut être résolu en améliorant l'algorithme dans la plupart des cas.

Selon la cause du goulot d'étranglement, SWIG ou Numba peuvent être plus appropriés, alors utilisez la bonne personne au bon endroit.

Code à améliorer avec Cython

Traitement en boucle

La boucle Python est lente. Cela est dû au fait que diverses vérifications sont effectuées au moment de la boucle en raison de la liberté de stocker différents types dans le tableau. Même si vous utilisez Numpy rapide, tourner le tableau avec pour réduira considérablement la vitesse, et c'est une règle empirique d'éviter le traitement en boucle lors de l'utilisation de Numpy.

Traitement arithmétique

En raison du degré de liberté dû au langage typé dynamiquement, la vérification du type de variable est incluse pour chaque opération. Même une simple opération de a + b doit passer par la méthode __add__, ce qui entraîne une surcharge pour chaque opération.

Appel de fonction

Non limités à Python, les appels de fonction entraînent une surcharge importante. En particulier, les langages typés dynamiquement ont une surcharge plus importante que les langages typés statiquement car la vérification de type est effectuée même lors de l'affectation à la pile.

Cython commençant par Jupyter (IPython)

Jupyter est le meilleur moyen d'implémenter Cython. Cython prend en charge la commande magick de Jupyter, vous pouvez donc facilement l'essayer sur Jupyter.

Sur Jupyter, tapez la commande suivante pour activer Cython.

%load_ext Cython

Expérimentons avec le nombre de Fibonacci que tout le monde aime. Tout d'abord, en Python, créez une fonction Python qui recherche le numéro de Fibonacci.

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

Mesure de vitesse


%timeit py_fib(1000)
>>> 10000 loops, best of 3: 66.9 µs per loop

Ensuite, tapez la commande magique %% cython au début pour créer une fonction qui a exactement le même contenu que la fonction Python précédente. Encore une fois, le contenu est exactement le même que celui de Python, seul le nom de la fonction est différent.

%%cython
def cy_fib(n):
    a, b = 0.0, 1.0
    for i in range(n):
        a, b = a + b, a
    return a

Mesure de vitesse


%timeit cy_fib(1000)
>>> 100000 loops, best of 3: 16 µs per loop

Juste en changeant la fonction Python en Cython, elle est passée de 66,9µs à 16µs, ce qui est plus de 4 fois plus rapide sans rien faire. Cython est assez compatible avec la syntaxe Python, et Cython le convertira en C / C ++ tel quel, à moins qu'il ne s'agisse de code Python trop spécial.

Spécifions le type pour le rendre encore plus rapide.

%%cython
def cy_fib2(int n):
    a, b = 0.0, 1.0
    for i in range(n):
        a, b = a + b, a
    return a

Mesure de vitesse


%timeit cy_fib2(1000)
>>> 1000000 loops, best of 3: 1.11 µs per loop

66,9 µs → 1,11 µs, ce qui est 60 fois plus rapide.

L'important ici est que seule la partie `` def cy_fin2 (int n) '' est définie par type, sinon c'est exactement la même chose que la fonction Python.

En fait, Cython fait l'inférence de type et convertit automatiquement les variables ʻaetb en double type et la variable ʻi en type int. Même si le code Python est collé tel quel, il se comporte autant que possible à partir du code Python d'origine et est converti en C / C ++ afin de ne pas nuire aux performances.

En Cython, ** le typage aveugle n'a pas beaucoup de sens juste pour réduire la lisibilité **, dans la plupart des cas, vous pouvez obtenir des dizaines de fois plus rapidement en tapant simplement quelques variables.

Si vous tapez %% cython -a et que vous l'exécutez, Python et C / C ++ ainsi que les lignes qui prennent beaucoup de temps à traiter seront affichés en jaune.

cython.png

L'utilisation légitime de Cython est de copier et coller le code Python sans y penser, et de taper préférentiellement les lignes jaunes.

Résumé

En résumé, les parties qui doivent être optimisées pour accélérer ne sont que quelques fonctions dans le code du programme, et seules quelques lignes de ces fonctions devraient être optimisées par Cython. Par conséquent, Cython essaie d'y parvenir facilement tout en conservant la lisibilité.

Cython est souvent considéré comme difficile, mais grâce aux efforts des développeurs Cython, il est presque parfaitement compatible avec Python. Si vous souhaitez accélérer partiellement, vous pouvez obtenir suffisamment d'avantages sans connaître le C / C ++. (Dans 99% des cas, seules quelques accélérations permettront d'atteindre l'objectif)

~~ Cython est très profond, et je profiterai d'une autre occasion pour expliquer comment l'utiliser. ~~

Continuez vers Introduction à Cython sans approfondir -2-.

Recommended Posts

Une introduction à Cython sans aller plus loin
Introduction à Cython sans approfondir -2-
Introduction à Word2Vec que même les chats peuvent comprendre
Introduction à l'écriture de Cython [Notes]
Introduction à Private TensorFlow
Introduction au Deep Learning ~ Règles d'apprentissage ~
Une introduction à la programmation Python
Introduction à l'optimisation bayésienne
Apprentissage par renforcement profond 1 Introduction au renforcement de l'apprentissage
Introduction au Deep Learning ~ Rétropropagation ~
[Introduction à StyleGAN] Cet "homme qui ne rit pas" a souri sans le vouloir ♬
Introduction à Python que même les singes peuvent comprendre (partie 3)
Introduction à Python que même les singes peuvent comprendre (partie 1)
Introduction à Python que même les singes peuvent comprendre (partie 2)
Une introduction à Mercurial pour les non-ingénieurs
Introduction à l'apprentissage en profondeur ~ Approximation des fonctions ~
Introduction à l'apprentissage profond ~ Préparation au codage ~
Introduction au Deep Learning ~ Dropout Edition ~
Introduction au Deep Learning ~ Propagation vers l'avant ~
Introduction à l'apprentissage profond ~ Expérience CNN ~
Premiers pas avec Python pour les non-ingénieurs
[Tutoriel Python] Une introduction facile à Python
Une introduction aux Pandas pour apprendre tout en souffrant [Partie 1]
Introduction au Deep Learning ~ Pliage et mise en commun ~
Une introduction à OpenCV pour l'apprentissage automatique
Réseau neuronal récursif: une introduction à RNN
Une introduction à Python pour l'apprentissage automatique
Une introduction à l'orientation des objets - Donnez à un objet un enfant.
Une introduction à Python pour les programmeurs en langage C
Introduction au Deep Learning (1) --Chainer est expliqué d'une manière facile à comprendre pour les débutants-
Qu'est-ce qu'un algorithme? Introduction à l'algorithme de recherche] ~ Python ~
Une introduction à l'apprentissage automatique pour les développeurs de robots
Une introduction à la programmation orientée objet pour les débutants par les débutants
Un amateur a essayé le Deep Learning avec Caffe (Introduction)
Introduction à la modélisation statistique pour l'analyse des données
Introduction à l'apprentissage profond ~ Fonction de localisation et de perte ~
Introduction à Python "Re" 1 Construction d'un environnement d'exécution
Une introduction à l'analyse vocale pour les applications musicales
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
Introduction à Scrapy (4)
Introduction à discord.py (2)
Introduction au traitement parallèle distribué Python par Ray
Note de lecture: Introduction à l'analyse de données avec Python
Comment créer un serveur HTTPS avec Go / Gin
Comment déployer une application Go sur une instance ECS
Introduction à l'apprentissage automatique à partir de Simple Perceptron