Hinweise zur Beschleunigung des Python-Codes mit Numba

Einführung

Vergleich der Berechnungszeit des in Python geschriebenen gleitenden Durchschnitts Daher stellte ich fest, dass der gleitende Durchschnitt (LWMA), der die for-Anweisung verwendet, langsam und unbrauchbar ist, aber einige der technischen Indikatoren von MetaTrader können nicht ohne die for-Anweisung geschrieben werden, sodass ich nicht aufgeben kann. Also habe ich versucht, es zu beschleunigen.

Vorläufig wusste ich, dass es Cython zum Beschleunigen gab, aber ich musste den Code neu schreiben, und als ich mich mit anderen Dingen befasste, gab es Numba. Dieses Mal ist ein Memo, als ich Numba ausprobiert habe.

Sehr langsamer Code mit for-Anweisung

import numpy as np
import pandas as pd
dataM1 = pd.read_csv('DAT_ASCII_EURUSD_M1_2015.csv', sep=';',
                     names=('Time','Open','High','Low','Close', ''),
                     index_col='Time', parse_dates=True)

def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'], 10)
1 loop, best of 3: 3min 14s per loop

Wie im vorherigen Artikel dauert es länger als 3 Minuten.

Versuchen Sie es mit Numba

Numba scheint in Anaconda zu sein, also importiere und füge einfach @ numba.jit hinzu.

import numba
@numba.jit
def LWMA(s, ma_period):
    y = pd.Series(0.0, index=s.index)
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'], 10)
1 loop, best of 3: 3min 14s per loop

Oh, das gleiche Ergebnis. Es hat keine Wirkung. Ist Numba Numpy mit seinem Namen gewidmet?

Versuchen Sie, Pandas in Numpy zu ändern

Ich habe die Eingabedaten vom Pandas-Serientyp in den Numpy-Array-Typ geändert.

@numba.jit
def LWMA(s, ma_period):
    y = np.zeros(len(s))
    for i in range(len(y)):
        if i<ma_period-1: y[i] = 'NaN'
        else:
            y[i] = 0
            for j in range(ma_period):
                y[i] += s[i-j]*(ma_period-j)
            y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'].values, 10)
1 loop, best of 3: 2.11 s per loop

Diesmal ist es schneller. Ungefähr 90 Mal. Es ist jedoch immer noch langsam im Vergleich zu einigen Millisekunden Scipy.

Versuchen Sie, die if-Anweisung zu entfernen

Selbst beim Kompilieren wird entschieden, dass der Code einfach sein sollte, daher habe ich die if-Anweisung entfernt. Tatsächlich war diese if-Anweisung ein Code, der möglicherweise vorhanden ist oder nicht.

@numba.jit
def LWMA(s, ma_period):
    y = np.zeros(len(s))
    for i in range(len(y)):
        for j in range(ma_period):
            y[i] += s[i-j]*(ma_period-j)
        y[i] /= ma_period*(ma_period+1)/2
    return y

%timeit MA = LWMA(dataM1['Close'].values, 10)
100 loops, best of 3: 5.73 ms per loop

kam heraus! Millisekunde. Selbst wenn es eine for-Anweisung gäbe, könnte sie so schnell wie scipy sein. Du kannst es schaffen, Python.

Zusammenfassung

Code, der mithilfe der for-Anweisung verlangsamt wurde, kann mithilfe von Numba beschleunigt werden. Es funktionierte jedoch bei Numpy und hatte keine Auswirkungen auf Pandas.

Referenzartikel

Ich dachte, es wäre langsam, die for-Anweisung in NumPy zu verwenden, aber das war nicht der Fall

Recommended Posts

Hinweise zur Beschleunigung des Python-Codes mit Numba
Ich habe versucht, Python-Code zu beschleunigen, einschließlich der if-Anweisung mit Numba und Cython
Beschleunigen Sie Python mit numba grob
Richten Sie eine Python-Entwicklungsumgebung mit Visual Studio Code ein
Beachten Sie, was Sie getan haben, um Flycheck mit Python zu verwenden
Ein Memo mit Python2.7 und Python3 in CentOS
Kartenmietinformationen auf einer Karte mit Python
Führen Sie Python-Code in der A2019 Community Edition aus
Vorgehensweise zum Erstellen einer virtuellen Python-Umgebung mit VS-Code unter Windows
Erstellen Sie eine Python-Umgebung mit ansible auf centos6
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Folium: Visualisieren Sie Daten auf einer Karte mit Python
Richten Sie eine Python-Entwicklungsumgebung auf Marvericks ein
Entschlüsseln Sie eine unter iOS mit Python verschlüsselte Zeichenfolge
Visualisiere grib2 auf einer Karte mit Python (matplotlib)
Erstellen Sie eine Python-Ausführungsumgebung mit VS-Code
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Python Ver. Einführung in WebPay mit ein wenig Code
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Starten Sie Django auf einem Docker-Container mit Docker-Compose Up
Laden / Anzeigen und Beschleunigen von GIF mit Python [OpenCV]
Richten Sie mit Sublime Text 2 eine Python-Entwicklungsumgebung ein
[Vagrant] Richten Sie einen einfachen API-Server mit Python ein
Holen Sie sich den Ländercode mit Python
Richten Sie Python 3.4 unter Ubuntu ein
Python mit VSCode (Windows 10)
[Hinweis] Betreiben Sie MongoDB mit Python
Debuggen Sie Python mit VS-Code
Machen Sie eine Lotterie mit Python
Erstellen Sie ein Verzeichnis mit Python
In Bezug auf die Beschleunigung von Python (Hinweis)
Dokumentieren Sie Python-Code mit Doxygen
Ein Hinweis zu [Python] __debug__
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
[Python] Mit Scheiben umkehren! !! (Es gibt auch einen Kommentar zu Scheiben!)
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Ein Hinweis beim Berühren der Gesichtserkennungs-API von Microsoft mit Python
Versuchen Sie, ein Unterfenster mit PyQt5 und Python zu öffnen
Erstellen Sie eine Python-Umgebung mit WSL + Pyenv + Jupyter + VSCode
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Ich möchte eine GUI-Entwicklungsumgebung mit Python oder Golang auf dem Mac einrichten
Erstellen einer Python-Umgebung auf einem Mac
[Python] Was ist eine with-Anweisung?
Löse ABC163 A ~ C mit Python
Steuern Sie den Motor mit einem Motortreiber mit Python auf Raspberry Pi 3!
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
Erstellen Sie eine 64-Bit-Python 2.7-Umgebung mit TDM-GCC und MinGW-w64 unter Windows 7
Lassen Sie uns eine GUI mit Python erstellen.
Erstellen einer Python-Umgebung unter Ubuntu
Python: Ein Hinweis zu Klasse 1 "Abstract"
Erstellen Sie mit Anaconda und PyCharm eine Python-Umgebung auf Ihrem Mac
Löse ABC166 A ~ D mit Python
Erstellen Sie eine Python-Umgebung auf dem Mac (2017/4)
Erstellen Sie eine virtuelle Umgebung mit Python!
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
Ich habe mit Python eine Lotterie gemacht.