L'écriture explicite d'une boucle avec numpy est extrêmement lente

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

Article associé

N'écrivez pas autant que possible de doubles boucles dans le traitement d'image

Recommended Posts

L'écriture explicite d'une boucle avec numpy est extrêmement lente
Lors de l'écriture d'un programme en Python
Hash en Perl est un dictionnaire en Python
L'opérateur de Python est-il lent? (À partir de ABC167D)
Le programme Python est lent! Je veux accélérer! Dans ce cas ...
Un mémo que j'ai écrit un tri de fusion en Python
Créer un modèle d'antenne cadre en Python dans KiCad