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.
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.
La fonction universelle de «numpy» prend «ndarray» comme argument et renvoie «ndarray». La fonction «math» ne peut prendre que «int »ou« float ».
La fonction math
ne peut pas prendre complexe
. Si vous voulez passer complexe
, utilisez cmath
. Numpy
peut aussi prendre complexe
.
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».
ndarray
par listeComme 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.
É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é.
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 ...
Il s'est avéré que NumPy et SciPy sont suffisants pour les calculs scientifiques.
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