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.
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.
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?
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.
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.
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.
Ich dachte, es wäre langsam, die for-Anweisung in NumPy zu verwenden, aber das war nicht der Fall
Recommended Posts