Remarques sur l'accélération du code Python avec Numba

introduction

Comparé le temps de calcul de la moyenne mobile écrite en Python Donc, j'ai trouvé que la moyenne mobile (LWMA) utilisant l'instruction for est lente et inutilisable, mais certains des indicateurs techniques de MetaTrader ne peuvent pas être écrits sans utiliser l'instruction for, donc je ne peux pas abandonner. Alors j'ai essayé de l'accélérer.

Pour le moment, je savais qu'il y avait Cython pour accélérer, mais c'était que je devais réécrire le code, donc quand j'ai regardé dans d'autres choses, il y avait Numba. Cette fois, c'est un mémo quand j'ai essayé Numba.

Code très lent avec instruction for

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

Comme pour l'article précédent, cela prendra plus de 3 minutes.

Essayez d'utiliser Numba

Numba semble être dans Anaconda, alors importez et ajoutez simplement @ numba.jit.

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, le même résultat. Cela n'a aucun effet. Numba est-il dédié à Numpy par son nom?

Essayez de changer les pandas en numpy

J'ai changé les données d'entrée du type pandas Series au type de tableau numpy.

@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

Cette fois, c'est plus rapide. Environ 90 fois. Cependant, il est encore lent par rapport à quelques millisecondes de scipy.

Essayez de supprimer l'instruction if

Même lors de la compilation, il est décidé que le code doit être simple, j'ai donc supprimé l'instruction if. En fait, cette instruction if était un code qui peut être présent ou non.

@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

sortit de! milliseconde. Même s'il y avait une instruction for, elle pourrait être aussi rapide que scipy. Vous pouvez le faire, Python.

Résumé

Le code qui a été ralenti à l'aide de l'instruction for pourrait être accéléré à l'aide de Numba. Cependant, cela fonctionnait pour numpy et n'avait aucun effet sur les pandas.

Article de référence

Je pensais qu'il était lent d'utiliser l'instruction for dans NumPy, mais ce n'était pas le cas

Recommended Posts

Remarques sur l'accélération du code Python avec Numba
J'ai essayé d'accélérer le code Python, y compris l'instruction if avec Numba et Cython
Accélérez grossièrement Python avec numba
Configurer un environnement de développement Python avec Visual Studio Code
Notez ce que vous avez fait pour utiliser Flycheck avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
Carte des informations de location sur une carte avec python
Exécutez le code Python sur A2019 Community Edition
Procédure de création d'un environnement virtuel Python avec VS Code sous Windows
Créez un environnement python avec ansible sur centos6
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Folium: Visualisez les données sur une carte avec Python
Configurer un environnement de développement Python sur Marvericks
Décrypter une chaîne chiffrée sur iOS avec Python
Visualiser grib2 sur une carte avec python (matplotlib)
Créer un environnement d'exécution python avec VS Code
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Python Ver. Présentation de WebPay avec un peu de code
Faire un point d'arrêt sur la couche c avec python
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Chargement / affichage et accélération de gif avec python [OpenCV]
Configurer un environnement de développement Python avec Sublime Text 2
[Vagrant] Configurer un serveur API simple avec python
Obtenez le code du pays avec python
Configurer Python 3.4 sur Ubuntu
Python avec VSCode (Windows 10)
[Note] Faites fonctionner MongoDB avec Python
Déboguer Python avec VS Code
Faites une loterie avec Python
Créer un répertoire avec python
Concernant l'accélération de python (Note)
Documenter le code Python avec Doxygen
Une note sur [python] __debug__
Une note sur l'utilisation de l'API Facebook avec le SDK Python
[python] Inversez avec des tranches! !! (Il y a aussi un commentaire sur les tranches!)
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Une note quand j'ai touché l'API de reconnaissance faciale de Microsoft avec Python
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Créer un environnement Python avec WSL + Pyenv + Jupyter + VSCode
[Python] Créer un écran pour le code d'état HTTP 403/404/500 avec Django
Je souhaite configurer un environnement de développement GUI avec Python ou Golang sur Mac
Construire un environnement Python sur Mac
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Contrôlez le moteur avec un pilote de moteur en utilisant python sur Raspberry Pi 3!
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Créez un environnement Python 2.7 64 bits avec TDM-GCC et MinGW-w64 sous Windows 7
Faisons une interface graphique avec python.
Construire un environnement Python sur Ubuntu
Python: une note sur les classes 1 "Résumé"
Créez un environnement Python sur votre Mac avec Anaconda et PyCharm
Résoudre ABC166 A ~ D avec Python
Créer un environnement Python sur Mac (2017/4)
Créez un environnement virtuel avec Python!
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'ai fait une loterie avec Python.