Comme mentionné dans "Comment utiliser lentement le langage informatique" Ecrire une boucle explicitement avec numpy est extrêmement lent. Ce qui suit est une histoire pour les débutants.
J'ai écrit le code pour l'expérimenter.
matmul.py
# -*- coding: utf-8 -*-
u"""
Comparaison de la vitesse du fonctionnement de la matrice
"""
def matmul1(a, b):
lenI = a.shape[0]
lenJ = a.shape[1]
lenK = b.shape[1]
c = np.zeros((lenI, lenJ))
for i in range(lenI):
for j in range(lenJ):
for k in range(lenK):
c[i, j] += a[i, k] * b[k, j]
return c
def matmul2(a, b):
lenI = a.shape[0]
lenJ = a.shape[1]
lenK = b.shape[1]
c = np.zeros((lenI, lenJ))
for i in range(lenI):
for k in range(lenK):
for j in range(lenJ):
c[i, j] += a[i, k] * b[k, j]
return c
import numpy as np
a = np.random.randn(200, 200)
b = np.random.randn(200, 200)
print a.shape
c2 = matmul2(a, b)
print c2
c = matmul1(a, b)
print c
c3 = np.dot(a, b)
print c3
Dans la console IPython Exécutez ce code une fois pour activer la définition de fonction J'ai comparé en utilisant% timeit. Cela fait une différence de 20 fois.
%timeit c2 = matmul2(a, b) 1 loops, best of 3: 7.39 s per loop
%timeit c1 = matmul1(a, b) 1 loops, best of 3: 7.31 s per loop
%timeit c3 =np.dot(a, b) 1000 loops, best of 3: 321 µs per loop
Résumé Lors de l'utilisation d'une bibliothèque optimisée pour les opérations matricielles telles que numpy En gros, n'écrivez pas d'instruction for qui accède individuellement aux éléments de la matrice. Lisez la documentation numpy pour savoir quelle fonction appeler. Pour l’environnement intégré Spyder [aide] [Modules Python installés] Vous pouvez lire la documentation numpy.
Découvrez la puissance de l'accélération avec NumPy / SciPy
N'écrivez pas autant que possible de doubles boucles dans le traitement d'image
Recommended Posts