Wie in "Wie man die Computersprache langsam benutzt" erwähnt Das explizite Schreiben einer Schleife mit numpy ist extrem langsam. Das Folgende ist eine Geschichte für Anfänger.
Ich habe den Code geschrieben, um damit zu experimentieren.
matmul.py
# -*- coding: utf-8 -*-
u"""
Geschwindigkeitsvergleich des Matrixbetriebs
"""
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
In der IPython-Konsole Führen Sie diesen Code einmal aus, um die Funktionsdefinition zu aktivieren Ich habe mit% timeit verglichen. Es macht einen Unterschied von 20 mal.
%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
Zusammenfassung Bei Verwendung einer Bibliothek, die für Matrixoperationen wie numpy optimiert ist Schreiben Sie grundsätzlich keine for-Anweisung, die einzeln auf die Elemente der Matrix zugreift. Lesen Sie die Numpy-Dokumentation, um herauszufinden, welche Funktion aufgerufen werden soll. Für die integrierte Spyder-Umgebung [Hilfe] [Installierte Python-Module] Sie können die Numpy-Dokumentation lesen.
Sehen Sie, wie schnell Sie mit NumPy / SciPy beschleunigen können
Schreiben Sie in der Bildverarbeitung nicht so viele Doppelschleifen wie möglich
Recommended Posts