J'ai commencé à travailler avec numba aujourd'hui, principalement parce que j'ai une boucle for-imbriquée qui peut prendre du temps avec du code python régulier.Numba JIT changer les résultats si les valeurs sont imprimées
J'ai une version macports de python-2.7 avec LLVM-3.6 et la version pépin de Numba (tout est à jour)
Voici le code que je utilise:
import pandas as pd
from numba import jit
from numpy import nan, full
@jit
def movingAverage(adj_close, maxMA):
ma = full([len(adj_close), maxMA], nan, dtype=float64)
ind = range(1, len(adj_close)+1)
for d in ind:
m = max(0, d-maxMA-1)
adj = adj_close[d-1:m:-1] if (m or d==maxMA+1) else adj_close[d-1::-1]
cs = adj.cumsum()
for i in range(len(adj)):
ma[d-1][i] = (cs[i]/(i+1))
print ma
return ma
Je calcule une moyenne mobile pour l'entrée adj_close
jusqu'à maxMA
jours.
adj_close
est un tableau de valeurs, une valeur par jour
I a commencé par la création d'ma
, un support pour les valeurs qui vont être calculée. Et travailler les Vaules pour chaque jour individuellement (notez que le premier jour ne peut avoir une moyenne impliquant 1 jour, le second, 2 et ainsi de suite jusqu'à la MAXMA)
Si je entrée quelque chose comme adj_close = array(range(5), dtype=float64)
et maxMA = 3
obtenir le bonne réponse comme suit:
array([[ 0., nan, nan],
[ 1., 0.5, nan],
[ 2., 1.5, 1.],
[ 3., 2.5, 2.],
[ 4., 3.5, 3.]])
Toutefois, si je prends la ligne print ma
, juste avant le retour de ma fonction, il retourne seulement une partie de la réponse:
array([[ nan, nan, nan],
[ nan, nan, nan],
[ nan, nan, nan],
[ 3., 2.5, 2.],
[ 4., 3.5, 3.]])
Pourquoi est-il ainsi? Pourquoi @jit a-t-il besoin de l'impression entre ces boucles pour obtenir la bonne réponse? Que puis-je faire pour me débarrasser de l'instruction d'impression (ce qui augmente considérablement le temps d'exécution)?
Edit: Je suis d'accepter la suggestion @JoshAdel et a ouvert un issue au github de Numba. J'accepte donc @MSeifert réponse que la solution de contournement a résolu le problème pour moi.
On dirait un bug pour moi. Je posterais quelque chose aux problèmes de Numba sur github puisque vous avez un exemple minimal qui démontre le problème. – JoshAdel
Malheureusement, je reçois la bonne réponse quand je l'exécute (Python3, et peut-être une version différente de Numba). Cependant, je me demande si changer votre ligne d'indexation à 'ma [d-1, i] = ...' aiderait. Je pense que @MSeifert a raison sur le mode python vs nopython, et je me souviens que le mode nopython ne traite pas de l'indexation séquentielle (c'est-à-dire [a] [b] ') très bien. – DavidW