[PYTHON] Accélération du calcul numérique avec NumPy / SciPy: ramasser les oreilles tombées

Cible

Il est écrit pour les débutants de Python et NumPy. Il peut être particulièrement utile pour ceux qui visent le calcul numérique de systèmes physiques correspondant à "Je peux utiliser le langage C mais j'ai récemment commencé Python" ou "Je ne comprends pas comment écrire comme Python". Peut être.

De plus, il peut y avoir des descriptions incorrectes en raison de mon manque d'étude. Veuillez me pardonner.

Résumé

Accélération du calcul numérique avec NumPy: Basics Accélération du calcul numérique à l'aide de NumPy / SciPy: Application 1 Accélération du calcul numérique à l'aide de NumPy / SciPy: Application 2

C'est un bonus, il s'agit principalement de petites histoires.

fonctions numpy et mathématiques

  1. La fonction universelle de «numpy» prend «ndarray» comme argument et renvoie «ndarray». La fonction «math» ne peut prendre que «int »ou« float ».

  2. La fonction math ne peut pas prendre complexe. Si vous voulez passer complexe, utilisez cmath. Numpy peut aussi prendre complexe.

  3. La fonction numpy renvoie un RuntimeWarning si elle est en dehors de la définition ou si vous lui donnez une valeur terrible, mais elle ne renvoie pas d'exception. La fonction math renvoie une exception:

import numpy as np
import math as m

m.log(0) # ValueError: math domain error
mp.log(0) # RuntimeWarning: divide by zero encountered in log
>>> -inf

mp.log(-1) # RuntimeWarning: invalid value encountered in log
>>> nan

Je suis content que np.log (0) retourne -inf.

Comme vous pouvez le voir, la fonction universelle de «numpy» est polyvalente, mais il semble que «math» est plus rapide en termes d'exécution. À moins que vous ne vouliez passer «ndarray», vous devriez utiliser la fonction «math».

Accès à ndarray par liste

Comme je l'ai mentionné précédemment, vous pouvez accéder au ndarray dans une liste:

a = [1, 3, 5]
b = [7, 5, 4, 6, 2, 3, 1, 9, 8]
b[a] # TypeError: list indices must be integers or slices, not list

b_np = np.array(b)
b_np[a]
>>> array([5, 6, 3])

Il y aura des situations qu'il est utile de connaître.

Pour mieux BLAS

Étant donné que le fonctionnement de la matrice de base de numpy dépend de BLAS (Basic Linear Algebra Subprograms), la vitesse varie considérablement en fonction du BLAS utilisé. Par exemple," référence BLAS "qui est inclus dans le système Ubuntu en standard est assez bon. C'est une implémentation lente, et vous devez utiliser le BLAS correspondant pour rendre numpy lui-même plus rapide.

"Open BLAS [^ 1]" est l'un des premiers candidats. Pour plus de détails sur la méthode d'introduction et les effets, voir ici. Je vous suis redevable.

Cependant, en fait, MLK (Math Kernel Library) [^ 3] est installé en standard dans Anaconda [^ 2], et il est très rapide tant que vous utilisez numpy dessus. Ceux qui utilisent NumPy / SciPy devraient utiliser Anaconda. Il ne semble y avoir aucune raison de ne plus l'utiliser.

Cependant, si vous installez Anaconda, le python du système sera écrasé par la version correspondante d'Anaconda, ce qui peut causer des problèmes autour du système. Par conséquent, il est préférable de l'installer via pyenv etc. À propos de la construction d'un environnement Python avec Anaconda Ici est détaillé.

Impressions sur un sous-ensemble d'accélération Python

Il existe un certain nombre de frameworks pour accélérer Python, et j'ai essayé d'en utiliser certains.

Cython

Est-ce un nouveau langage pour rendre les extensions C de Python plus faciles à utiliser? La syntaxe de base est Python, mais le code est compilé en C au moment de l'exécution. Pour accélérer les choses correctement, tapez des variables. Vous devez me dire la taille de la liste et si vous l'écrivez correctement, la vitesse d'exécution est vraiment C.

Lorsque le goulot d'étranglement du code est évident, vaut-il mieux faire de cette partie une fonction et la réécrire avec Cython? Cependant, la variable a un type et la taille de la liste est fixe, donc ce n'est plus Python. En écrivant, j'ai pensé à plusieurs reprises que "Si vous voulez écrire ceci, écrivez-le en C depuis le début ..." Je ne pense pas que ce sera du code Pythonic.

Boost/Python

Bibliothèque Boost qui vous permet d'importer des classes et des fonctions C ++ à partir de Python telles quelles. Cython peut être écrit en Python en incluant la partie que vous souhaitez accélérer, mais il est difficile à construire. Boost / Python est C / C ++ uniquement pour la partie que vous souhaitez accélérer. Vous pouvez nous le laisser.

Cependant, les articulations avec plusieurs langages ont toujours un problème de type douloureux. Il semble que vous ne pouvez pas passer ndarray du côté C ++. Il existe des frameworks tels que Boost / NumPy et PyUblas qui peuvent passerndarray, mais en construisant avec Python3 Cela ne se réalise pas.

Numba

Un module qui accélère l'utilisation du compilateur JIT. Il fonctionne avec un seul décorateur, et le module n'en chevauche pas plus de deux comme les deux ci-dessus. Bien que je ressens beaucoup l'avenir, je sens que le savoir-faire n'est pas mûr. Parfois ça va plus vite, parfois ça échoue ...

Conclusion

Il s'est avéré que NumPy et SciPy sont suffisants pour les calculs scientifiques.

en conclusion

Je peux l'ajouter chaque fois que je trouve quelque chose. Merci beaucoup.

[^ 1]: Ceci est un fork de "Go to BLAS" fait par un certain M. Goto. M. Goto semble développer MKL maintenant, et le développement de Goto BLAS s'est arrêté. Il semble y avoir.

[^ 2]: Ceci est un joli paquet de modules scientifiques et technologiques.

[^ 3]: Bibliothèque pour diverses routines mathématiques développées par Intel. Contient des implémentations très rapides telles que BLAS, LAPACK.

Recommended Posts

Accélération du calcul numérique avec NumPy / SciPy: ramasser les oreilles tombées
Accélération du calcul numérique avec NumPy / SciPy: Application 2
Accélération du calcul numérique avec NumPy / SciPy: Application 1
Accélérer les calculs numériques avec NumPy: principes de base
Découvrez la puissance de l'accélération avec NumPy / SciPy
[Python] Accélération du traitement à l'aide des outils de cache
[Calcul scientifique / technique par Python] Résolution de problèmes de valeurs propres (généralisés) en utilisant numpy / scipy, en utilisant des bibliothèques