Dieser Artikel basiert auf dem Kommentar von @ shiracamus in Zuvor geschriebener Artikel.
numpy's all ist eine Funktion, die True zurückgibt, wenn alle Elemente des numpy-Arrays True sind, andernfalls False. Die Dokumentation finden Sie hier (https://docs.scipy.org/doc/numpy/reference). /generated/numpy.ndarray.all.html#numpy.ndarray.all). Hier beziehen wir uns auf `ndarray.all ()`
. Wie in der Dokumentation angegeben, `np. All ()
hat die gleiche Bedeutung und es scheint eine Funktion namens
np.alltrue ()
`zu geben, aber Github-Quellcode Wenn man sich /blob/master/numpy/core/fromnumeric.py) ansieht, scheint es, dass diese beiden Funktionen schließlich ndarray.all () aufrufen, also werde ich sie dieses Mal nicht verwenden.
Da die Berechnung mit numpy sehr schnell ist, ist es im Grunde schneller, mit numpy zu berechnen, als sie direkt mit Python zu schreiben. Ich möchte sie jedoch einführen, da ich sie unter begrenzten Bedingungen umkippen könnte. Ich denke.
Außerdem ist numba eine Bibliothek, die Just In Time (JIT) aus Gründen der Geschwindigkeit kompiliert. Daher kann das Kompilieren beim ersten Zugriff auf die Funktion einige Zeit dauern. Insbesondere ein Hinweis (
@ numba.jit (numba.b1 (numba.b1 [:])) `) benötigt fast keine Kompilierungszeit, aber nicht (` `@ numba.jit
(Wenn `) kann einige Sekunden dauern. Es gibt keinen großen Unterschied in der Ausführungszeit nach der Kompilierung.
Vergleichen Sie die folgenden drei, wenn numba zum ersten Mal nicht verwendet wurde.
Wenn Sie numba nicht verwenden, kommentieren Sie einfach den Teil `` @ @ numba.jit``` aus.
test.py
import numpy as np
import numba
import time
import matplotlib.pyplot as plt
#Verwenden Sie integrierte Funktionen
@numba.jit(numba.b1(numba.b1[:]))
def builtin(arr):
return all(arr)
#Beschreiben Sie mit für Aussage
@numba.jit(numba.b1(numba.b1[:]))
def use_for(arr):
for element in arr:
if not element:
return False
else:
return True
#Verwenden Sie alle numpy
@numba.jit(numba.b1(numba.b1[:]))
def np_all(arr):
return arr.all()
#Testen Sie die Funktion als Argument
def test(func):
elapsed_time = []
for arr_size in range(1000):
arr = np.ones(arr_size).astype(np.bool)
start = time.time()
func(arr)
end = time.time()
elapsed_time.append((end - start) * 1e6)
return elapsed_time[1:]
if __name__ == '__main__':
plt.plot(test(use_for), 'g', label='for')
plt.plot(test(builtin), 'r', label='built-in')
plt.plot(test(np_all), 'b', label='numpy')
plt.legend()
plt.xlabel('array size')
plt.ylabel('elapsed time[us]')
plt.show()
python test.py
Die Ausführungszeit, wenn die Größe des Arrays 1000 oder weniger beträgt, ist wie in der Abbildung gezeigt. Daraus können Sie ersehen, dass numpy mit zunehmender Größe des Arrays nützlicher ist. Außerdem ist die integrierte Funktion besser als die for-Anweisung. Ich denke, dass es eine Eigenschaft von Python ist, schnell zu sein. Wenn es 200 oder weniger ist, habe ich festgestellt, dass die beiden anderen Methoden schneller als numpy sind. Diese Anzahl von 200 kann von der Umgebung abhängen. es gibt.
Die Darstellung erfolgt mit Ausnahme der für den ersten Zugriff verstrichenen Zeit. Das Ergebnis ist in der Abbildung dargestellt. Die integrierte Funktion scheint nicht durch numba beschleunigt zu werden, aber die all- und for-Anweisungen von numpy werden beschleunigt. Es ist auch interessant, dass * die eingebauten Funktionen langsamer sind als wenn numba nicht verwendet wurde *. Wenn sie andererseits in die for-Anweisung geschrieben werden, ist sie schneller und die Geschwindigkeit ist schneller als numpy.
Wenn das Array größer ist, sieht es wie in der folgenden Abbildung aus. Ohne die integrierten Funktionen. Die for-Anweisung scheint immer noch schneller zu sein.
Mir wurde klar, dass ich nach dem Schreiben immer wieder nicht auf die Verwendung der CPU geachtet habe
taskset -c 0 python test.py
Ich habe ein ähnliches Diagramm erhalten, als ich es ausgeführt habe, sodass es kein Problem gab.
Vielen Dank an @shiracamus.
Recommended Posts