[Python] Précautions lors de la recherche des valeurs maximum et minimum avec un tableau numpy avec un petit nombre d'éléments

Backtesting FX System avec Python Comme je l'ai mentionné dans l'article, seule la fonction SAR parabolique (iSAR) a pris du temps parmi les indicateurs techniques publiés sur GitHub. Je me demandais si cela pouvait être aidé car l'algorithme est compliqué, mais il s'est avéré qu'il y avait en fait un problème pour trouver les valeurs maximales et minimales.

Dans cet article, j'utiliserai un exemple de code pour résumer les problèmes.

exemple

Considérez le problème de l'extraction de 3 échantillons à la fois à partir de données chronologiques appropriées et de la recherche séquentielle de la valeur maximale. Cela ressemble à ceci lorsqu'il est écrit dans une formule.

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

Créez les données de série chronologique sous forme de séquence de nombres aléatoires comme suit.

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

4 types de code

Essayons 4 types de codes qui calculent la valeur maximale de 3 échantillons sous forme de série chronologique. func1 Faites le code tel qu'il est. Passez x [i], x [i-1], x [i-2] comme arguments à la fonction intégrée de Python 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 Un peu comme Python, utilisez des tranches et passez-les à l'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 Puisque numpy a également une fonction max, essayez d'utiliser np.max au lieu de max.

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 Listons les trois éléments x [i], x [i-1], x [i-2] et passons-les à l'argument de 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

Comparaison du temps d'exécution

%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

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

func1 est le plus rapide, func2, func3, func4 et ainsi de suite. func4 prend 14 fois plus de temps que func1. Accélération par numba Comparons l'accélération par numba avec le même code. Si vous faites attention à l'unité de temps et comparez, func1 est µs, donc il est extrêmement plus rapide. Le prochain plus rapide est func3. Vous pouvez clairement voir l'effet de l'accélération par numba. En comparaison, func2 et func4 sont plus lents que l'effet de numba. En conséquence, la différence entre func4 et func1 est 3700 fois plus grande. Après tout, lors de la recherche de la valeur maximale avec un petit nombre d'éléments, il s'est avéré que passer chaque élément individuellement à la fonction intégrée «max» est le plus rapide. En fait, dans le amax du document numpy, "maximum (a [0], a [1]) est plus rapide qu'un max (a, axis = 0). ", Un commentaire comme celui-là a été écrit.

Pourquoi iSAR était lent

Pour en revenir à l'histoire, la raison pour laquelle iSAR était lent était qu'il était écrit comme func4. Quand je l'ai écrit comme func1, il est devenu considérablement plus rapide. En raison de l'effet de numba, l'indice technique le plus lent à ce jour est devenu l'un des indicateurs techniques les plus rapides.

Je ne sais pas vraiment où Python a un goulot d'étranglement.

Recommended Posts

[Python] Précautions lors de la recherche des valeurs maximum et minimum avec un tableau numpy avec un petit nombre d'éléments
Obtenez le nombre d'éléments spécifiques dans la liste python
Précautions lors de la création d'un tableau à deux dimensions avec toutes les mêmes valeurs
Sortie sous la forme d'un tableau python
Comment compter le nombre d'éléments dans Django et sortir dans le modèle
[Python] Un programme qui trouve les valeurs minimales et maximales sans utiliser de méthodes
Obtenir la taille (nombre d'éléments) de Union Find en Python
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
[Python] Ne laissez que les éléments commençant par une chaîne de caractères spécifique dans le tableau
Trouver l'index de la valeur maximale (valeur minimale) d'un tableau multidimensionnel
[Homologie] Comptez le nombre de trous dans les données avec Python
Extraire les éléments du tableau et les index dans l'ordre décroissant avec numpy
Un serveur qui renvoie le nombre de personnes devant la caméra avec bottle.py et OpenCV
Trouvez la valeur maximale, la valeur minimale et le nombre d'éléments lorsque l'entier N est suivi de N entiers sur la première ligne de l'entrée standard.
Comptez bien le nombre de caractères thaïlandais et arabes en Python
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
[Python] Un programme qui trouve le nombre maximum de jouets pouvant être achetés avec votre argent
Comment écrire quand on veut mettre un nombre après le numéro de groupe à remplacer par une expression régulière dans re.sub de Python
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Comptez le nombre de fois que deux valeurs apparaissent simultanément dans un élément de type itérateur Python 3
Générez une liste contenant le nombre de jours du mois en cours.
python> array> Déterminer le nombre et initialiser> mylist = [idx pour idx dans la plage (10)] / mylist = [0 pour idx dans la plage (10)] >> mylist = [0] * 10
Vérifions la chaîne d'octets en mémoire du nombre flottant flottant en Python
[Python] Calculez le nombre de chiffres requis lors de la saisie de 0 [Note]
[Python] Comment utiliser la liste 2 Référence de la valeur de la liste, nombre d'éléments, valeur maximale, valeur minimale
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Obtenez des visites d'articles et des likes avec l'API Qiita + Python
Connaissances minimales requises pour traiter les «angles» et les «coordonnées» dans Ruby + Dans quelle direction est M. B du point de vue de M. A? Algorithme
Comment trier en spécifiant une colonne dans le tableau Python Numpy.
[Python] Combine tous les éléments dans un tableau
Une histoire sur le calcul de la vitesse d'une petite balle tombant tout en recevant la résistance de l'air avec Python et Sympy
[Python] Précautions lors de l'acquisition de données en grattant et en les mettant dans la liste
traitement (python) Diagramme les coordonnées de la liste Spécifiez le nombre de fois dans draw ()
Divise la chaîne de caractères par le nombre de caractères spécifié. En Ruby et Python.
[Python] Un programme qui calcule le nombre de mises à jour des enregistrements les plus élevés et les plus faibles
Extraire des éléments (en utilisant une liste d'index) comme NumPy d'une liste / taple Python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Obtenez le dernier élément du tableau en fractionnant les chaînes en Python et PHP
Comment obtenir une liste de fichiers dans le même répertoire avec python
Sortie du nombre de cœurs de processeur en Python
[Python] Récupérez les fichiers dans le dossier avec Python
Calculez le nombre total de combinaisons avec python
Copiez la liste en Python
Précautions lors du traitement des structures de contrôle dans Python 2.6
Trouvez le nombre de jours dans un mois
Réécrire des éléments dans une boucle de listes (Python)
[Python numpy] Spécifiez dynamiquement l'index du tableau
Prise en compte des forces et faiblesses de Python
[Python] Manipulation d'éléments dans une liste (tableau) [Trier]
Automatisez la suppression de l'arrière-plan pour les derniers portraits dans un répertoire avec Python et API
Prise en compte du moment où vous pouvez faire du bon travail en 10 ans avec Python3 et Scala3.
Le résultat de la création d'un album de cartes de jeunes mariés italiens en Python et de son partage
[Python] Un programme qui trouve le nombre d'étapes le plus court dans un jeu qui traverse les nuages
[Python] Changer la couleur du texte et la couleur d'arrière-plan d'un mot clé spécifique dans la sortie d'impression
Consolider un grand nombre de fichiers CSV dans des dossiers avec python (données sans en-tête)
Une note lors de la vérification si la clé spécifiée existe dans le dictionnaire défini avec python
[Art de la coquille] Seulement quand c'est un multiple de 3 et un nombre avec 3 devient stupide