[Python] Vorsichtsmaßnahmen beim Ermitteln der Maximal- und Minimalwerte mit einem Numpy-Array mit einer kleinen Anzahl von Elementen

Backtesting von FX Systre mit Python Wie ich in dem Artikel erwähnt habe, hat nur die parabolische SAR (iSAR) -Funktion unter den auf GitHub veröffentlichten technischen Indikatoren lange gedauert. Ich habe mich gefragt, ob es helfen könnte, weil der Algorithmus kompliziert ist, aber es stellte sich heraus, dass es tatsächlich ein Problem gab, wie man die Maximal- und Minimalwerte findet.

In diesem Artikel werde ich Beispielcode verwenden, um die Probleme zusammenzufassen.

Beispiel

Betrachten Sie das Problem, 3 Proben gleichzeitig aus geeigneten Zeitreihendaten zu extrahieren und den Maximalwert nacheinander zu ermitteln. Es sieht so aus, wenn es in einer Formel geschrieben ist.

y(n)=\max\\{x(n), x(n-1), x(n-2)\\}

Erstellen Sie die Zeitreihendaten wie folgt als Zufallszahlenfolge.

import numpy as np
x = np.random.randint(1000, size=100000)

4 Arten von Code

Ich werde 4 Arten von Codes ausprobieren, die den Maximalwert von 3 Stichproben als Zeitreihe berechnen. func1 Machen Sie den Code so wie er ist. Übergeben Sie "x [i], x [i-1], x [i-2]" als Argumente an die in Python integrierte Funktion "max".

def func1(x):
    y = np.empty(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = max(x[i], x[i-1], x[i-2])
    return y

func2 Verwenden Sie ein wenig wie Python Slices und übergeben Sie sie an das Argument "max".

def func2(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = max(x[i-2:i+1])
    return y

func3 Da numpy auch eine "max" -Funktion hat, versuchen Sie, "np.max" anstelle von "max" zu verwenden.

def func3(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = np.max(x[i-2:i+1])
    return y

func4 Listen wir die drei Elemente "x [i], x [i-1], x [i-2]" auf und übergeben sie an das Argument "np.max".

def func4(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = np.max([x[i], x[i-1], x[i-2]])
    return y

Vergleich der Ausführungszeit

Vergleichen wir die Ausführungszeiten der oben genannten vier Funktionen.

%timeit y1 = func1(x)
%timeit y2 = func2(x)
%timeit y3 = func3(x)
%timeit y4 = func4(x)
10 loops, best of 3: 91.6 ms per loop
1 loop, best of 3: 304 ms per loop
1 loop, best of 3: 581 ms per loop
1 loop, best of 3: 1.29 s per loop

func1 ist am schnellsten, func2, func3, func4 und so weiter. func4 dauert 14 mal länger als func1.

Beschleunigung mit Numba

Vergleichen wir mit demselben Code die Beschleunigung nach numba.

from numba import jit

@jit
def func1(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = max(x[i], x[i-1], x[i-2])
    return y

@jit
def func2(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = max(x[i-2:i+1])
    return y

@jit
def func3(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = np.max(x[i-2:i+1])
    return y

@jit
def func4(x):
    y = np.zeros(len(x), dtype=int)
    for i in range(2,len(x)):
        y[i] = np.max([x[i], x[i-1], x[i-2]])
    return y
%timeit y1 = func1(x)
%timeit y2 = func2(x)
%timeit y3 = func3(x)
%timeit y4 = func4(x)
1000 loops, best of 3: 365 µs per loop
1 loop, best of 3: 377 ms per loop
100 loops, best of 3: 4.33 ms per loop
1 loop, best of 3: 1.36 s per loop

Wenn Sie auf die Zeiteinheit achten und vergleichen, ist func1 µs, also überwältigend schneller. Der nächstschnellste ist func3. Sie können den Effekt der Beschleunigung durch numba deutlich sehen. Im Vergleich dazu sind func2 und func4 langsamer als der Effekt von numba.

Infolgedessen ist der Unterschied zwischen func4 und func1 3700-mal größer. Schließlich stellte sich beim Ermitteln des Maximalwerts mit einer kleinen Anzahl von Elementen heraus, dass es am schnellsten ist, jedes Element einzeln an die integrierte Funktion "max" zu übergeben.

Tatsächlich ist im amax des numpy-Dokuments "Maximum (a [0], a") [1]) ist schneller als ein Maximum (a, Achse = 0). ", Ein solcher Kommentar wurde geschrieben.

Warum iSAR langsam war

Zurück zur Geschichte: Der Grund, warum iSAR langsam war, war, dass es wie func4 geschrieben wurde. Als ich es wie func1 schrieb, wurde es dramatisch schneller. Aufgrund der Wirkung von Numba ist der bisher langsamste technische Index zu einem der schnelleren technischen Indikatoren geworden.

Ich weiß nicht genau, wo Python einen Engpass hat.

Recommended Posts

[Python] Vorsichtsmaßnahmen beim Ermitteln der Maximal- und Minimalwerte mit einem Numpy-Array mit einer kleinen Anzahl von Elementen
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Vorsichtsmaßnahmen beim Erstellen eines zweidimensionalen Arrays mit denselben Werten
Ausgabe in Form eines Python-Arrays
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
[Python] Ein Programm, das die minimalen und maximalen Werte ohne Verwendung von Methoden findet
Ermitteln Sie die Größe (Anzahl der Elemente) von Union Find in Python
Wie identifiziere ich das Element mit der geringsten Anzahl von Zeichen in einer Python-Liste?
[Python] Lassen Sie nur Elemente im Array, die mit einer bestimmten Zeichenfolge beginnen
Suchen Sie den Index des Maximalwerts (Minimalwerts) eines mehrdimensionalen Arrays
[Homologie] Zählen Sie mit Python die Anzahl der Löcher in den Daten
Extrahieren Sie Array-Elemente und -Indizes in absteigender Reihenfolge mit numpy
Ein Server, der mit Flasche.py und OpenCV die Anzahl der Personen vor der Kamera zurückgibt
Suchen Sie den Maximalwert, den Minimalwert und die Anzahl der Elemente, wenn auf die Ganzzahl N N Ganzzahlen in der ersten Zeile mit Standardeingabe folgen.
Zählen Sie die Anzahl der thailändischen und arabischen Zeichen in Python gut
[Python] Lassen Sie uns die Anzahl der Elemente im Ergebnis bei der Operation des Sets reduzieren
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
[Python] Ein Programm, das die maximale Anzahl von Spielzeugen findet, die mit Ihrem Geld gekauft werden können
So schreiben Sie, wenn Sie eine Zahl nach der Gruppennummer setzen möchten, die durch einen regulären Ausdruck in Python ersetzt werden soll
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Zählen Sie, wie oft zwei Werte gleichzeitig in einem Element vom Typ Python 3-Iterator angezeigt werden
Generieren Sie eine Liste mit der Anzahl der Tage im aktuellen Monat.
python> array> Bestimmen Sie die Nummer und initialisieren Sie> mylist = [idx für idx im Bereich (10)] / mylist = [0 für idx im Bereich (10)] >> mylist = [0] * 10
Überprüfen Sie die speicherinterne Byte-Zeichenfolge der Gleitkommazahl in Python
[Python] Berechnen Sie die Anzahl der Stellen, die zum Ausfüllen von Nullen erforderlich sind. [Hinweis]
[Python] Verwendung von Liste 2 Referenz des Listenwerts, der Anzahl der Elemente, des Maximalwerts und des Minimalwerts
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
Holen Sie sich Artikelbesuche und Likes mit Qiita API + Python
Erforderliche Mindestkenntnisse beim Umgang mit "Winkeln" und "Koordinaten" in Ruby + In welche Richtung ist Herr B aus der Sicht von Herrn A? Algorithmus
Sortieren durch Angabe einer Spalte im Python Numpy-Array.
[Python] Kombinieren Sie alle Elemente in einem Array
Eine Geschichte über die Berechnung der Geschwindigkeit eines kleinen Balls, der mit Python und Sympy beim Luftwiderstand fällt
[Python] Vorsichtsmaßnahmen beim Erfassen von Daten durch Scraping und Einfügen in die Liste
Verarbeitung (Python) Diagramm der Koordinaten der Liste Geben Sie an, wie oft in draw ()
Teilt die Zeichenfolge durch die angegebene Anzahl von Zeichen. In Ruby und Python.
[Python] Ein Programm, das die Anzahl der Aktualisierungen der höchsten und niedrigsten Datensätze berechnet
Extrahieren Sie Elemente (mithilfe einer Liste von Indizes) wie NumPy aus einer Python-Liste / einem Python
Holen Sie sich mit Python den Aktienkurs eines japanischen Unternehmens und erstellen Sie eine Grafik
Holen Sie sich das letzte Element des Arrays, indem Sie Zeichenfolgen in Python und PHP aufteilen
So erhalten Sie mit Python eine Liste der Dateien im selben Verzeichnis
Geben Sie die Anzahl der CPU-Kerne in Python aus
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Kopieren Sie die Liste in Python
Vorsichtsmaßnahmen beim Umgang mit Kontrollstrukturen in Python 2.6
Finden Sie die Anzahl der Tage in einem Monat
Umschreiben von Elementen in einer Listenschleife (Python)
[Python numpy] Geben Sie den Index des Arrays dynamisch an
Berücksichtigung der Stärken und Schwächen von Python
[Python] Manipulation von Elementen in einer Liste (Array) [Sortieren]
Automatisieren Sie das Entfernen des Hintergrunds für die neuesten Porträts in einem Verzeichnis mit Python und API
Überlegen Sie, wann Sie mit Python3 und Scala3 in 10 Jahren gute Arbeit leisten können.
Das Ergebnis der Erstellung eines Kartenalbums italienischer Jungvermählten in Python und dessen Weitergabe
[Python] Ein Programm, das die kürzeste Anzahl von Schritten in einem Spiel findet, das Wolken überquert
[Python] Ändern Sie die Textfarbe und Hintergrundfarbe eines bestimmten Schlüsselworts in der Druckausgabe
Konsolidieren Sie eine große Anzahl von CSV-Dateien in Ordnern mit Python (Daten ohne Header).
Ein Hinweis beim Überprüfen, ob der angegebene Schlüssel im definierten Wörterbuch mit Python vorhanden ist
[Shell Art] Nur wenn es ein Vielfaches von 3 ist und eine Zahl mit 3 dumm wird