2 votes

Y a-t-il un moyen d'optimiser les fonctions de statistiques numpy (par exemple, via numexpr) ?

Je dois calculer l'écart type et d'autres statistiques sur un grand ndarray multidimensionnel de données de points en grilles. Exemple :

import numpy as np
# ... les données en grilles sont lues dans des tableaux g1, g2, g3 ...
allg = numpy.array( [g1, g2, g3] )
allmg = numpy.ma.masked_values(allg, -99.)
sd = numpy.zeros((3, 3315, 8325))
np.std(allmg, axis=0, ddof=1, out=sd)

J'ai vu les avantages de performances de mettre des calculs numpy dans numexpr.evaluate() sur différents sites web mais je ne pense pas qu'il y ait un moyen d'exécuter np.std() dans numexpr.evaluate() (corrigez-moi si je me trompe). Y a-t-il d'autres moyens d'optimiser l'appel à np.std() ? Actuellement, cela prend environ 18 secondes à calculer sur mon système...j'espère le rendre beaucoup plus rapide d'une manière ou d'une autre...

2voto

HYRY Points 26340

Peut-être que vous pouvez utiliser le multiprocessus pour effectuer le calcul dans plusieurs processus. Mais avant d'essayer cela, vous pouvez essayer de réorganiser vos données afin de pouvoir appeler std() pour le dernier axe. Voici un exemple:

import numpy as np
import time
data = np.random.random((4000, 4000))

start = time.clock()
np.std(data, axis=0)
print time.clock() - start

start = time.clock()
np.std(data, axis=1)
print time.clock() - start

le résultat sur mon PC est :

0.511926329834
0.273098421142

puisque toutes les données sont dans une mémoire continue pour le dernier axe, l'accès aux données utilisera le cache du processeur de manière plus efficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X