[PYTHON] Über alle von numpy (2.)

Über alle von numpy (2.)

Dieser Artikel basiert auf dem Kommentar von @ shiracamus in Zuvor geschriebener Artikel.

Einführung

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.

Methode

Vergleichen Sie die folgenden drei, wenn numba zum ersten Mal nicht verwendet wurde.

  1. Greifen Sie in der Reihenfolge mit der for-Anweisung auf die Array-Elemente zu
  2. Integrierte Funktion all (Dokument ist hier)
  3. numpy alle Auf den ersten Blick sind 1 und 2 gleich, aber Sie können an den Ergebnissen erkennen, dass sie unterschiedlich sind. Ich würde auch gerne herausfinden, wann ich numba benutze.

Quellcode

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()

Ausführungsmethode

python test.py

Ergebnis

numba nicht verwendet

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. figure_1000_.png

Verwenden Sie numba

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. numba_1000_.png

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. numba_100000_.png

Fazit

numba nicht verwendet

Verwenden Sie numba

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.

Schließlich

Vielen Dank an @shiracamus.

Recommended Posts

Über alle von numpy (2.)
Über alles von numpy
Über Numpy
Über Numpy Broadcast
Informationen zur kumulativen Zuordnung von Liste und Numpy-Array
Über die Zuweisung von numpy.ndarray
Über Variable von Chainer
Über __all__ in Python
Funktion von NumPy einstellen
Über Importfehler von numpy und scipy in anaconda
Summe mehrerer Numpy-Arrays (Summe)
Über max_iter von LogisticRegression () von scikit-learn
Über den japanischen Weg von Pyminizip
Über die japanische Unterstützung von Cometchat
Über verschiedene Codierungen von Python 3
Über die Kostenberechnung von MeCab
Über den ungefähren Bruchteil des Umfangsverhältnisses
Über die Komponenten von Luigi
Über die HOG-Ausgabe von Scikit-Image
Über die Funktionen von Python
Über die Datenverwaltung von Amboss-App-Server
Über Numpy Array und Asarray
Visualisierung der von numpy erstellten Matrix
Über den Rückgabewert von pthread_mutex_init ()
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
[Memo] Kleine Geschichte von Pandas, numpy
Über die Obergrenze von Threads-max
Über die zirkuläre Überkreuzung genetischer Algorithmen
Über das Verhalten von Yield_per von SqlAlchemy
Informationen zum Importfehler von PyQt5.QtWidgets (Anaconda)
Über die Größe der Punkte in Matplotlib
Über die Farbhalbtonverarbeitung von Bildern
Informationen zur Grundlagenliste der Python-Grundlagen