J'effectue une boucle imbriquée dans python qui est inclus ci-dessous. Cela constitue un moyen fondamental de chercher dans les séries chronologiques financières existantes et de chercher des périodes dans les séries temporelles qui correspondent à certaines caractéristiques. Dans ce cas, il existe deux tableaux séparés, de taille égale, représentant la «clôture» (c'est-à-dire le prix d'un actif) et le «volume» (c'est-à-dire le montant de l'actif échangé sur la période). Pour chaque période de temps je voudrais anticiper tous les intervalles futurs avec des longueurs entre 1 et INTERVAL_LENGTH et voir si certains de ces intervalles ont des caractéristiques qui correspondent à ma recherche (dans ce cas, le rapport des valeurs proches est supérieur à 1.0001 et moins 1,5 et le volume additionné est supérieur à 100). Ma compréhension est que l'une des principales raisons de l'accélération lors de l'utilisation de NumPy est que l'interpréteur n'a pas besoin de vérifier par type les opérandes chaque fois qu'il évalue quelque chose tant que vous opérez sur le tableau en tant que entier (par exemple, numpy_array * 2), mais évidemment le code ci-dessous n'en profite pas. Y a-t-il un moyen de remplacer la boucle interne par une sorte de fonction de fenêtre qui pourrait entraîner une accélération, ou de toute autre manière en utilisant numpy/scipy pour accélérer cela sensiblement en python natif?Comment accélérer la boucle imbriquée python?
Sinon, existe-t-il un meilleur moyen de le faire en général (par exemple, est-ce que cela sera beaucoup plus rapide d'écrire cette boucle en C++ et d'utiliser le tissage)?
ARRAY_LENGTH = 500000
INTERVAL_LENGTH = 15
close = np.array(xrange(ARRAY_LENGTH))
volume = np.array(xrange(ARRAY_LENGTH))
close, volume = close.astype('float64'), volume.astype('float64')
results = []
for i in xrange(len(close) - INTERVAL_LENGTH):
for j in xrange(i+1, i+INTERVAL_LENGTH):
ret = close[j]/close[i]
vol = sum(volume[i+1:j+1])
if ret > 1.0001 and ret < 1.5 and vol > 100:
results.append([i, j, ret, vol])
print results
Votre calcul semble très simple, pourquoi n'utilisez-vous pas Cython? – Tarantula