[Python] Evitare cicli annidati....

M@T perini.matteo a gmail.com
Sab 14 Maggio 2011 12:37:15 CEST


Ciao,
ho un problema, dovuto molto probabilmente alla mia inesperienza, che 
credo mi allunghi parecchio i tempi di esecuzione del programma.

Ho un ciclo annidato di questo tipo:


matrixdata=np.array(matrix,dtype='int')
fase=np.zeros(matrixdata.shape)
for riga in range(matrixdata.shape[0]):
     A=matrixdata[riga]
     cw=wavelet(A)
     cwt=cw.getdata()
     val=cwt.__abs__()
     x=np.arange(val.shape[1])
     y=val.argmax(0)
     for i in x:
         fase[riga,i]=np.arctan2(cwt[y[i],x[i]].imag,cwt[y[i],x[i]].real)
     print  'ciclo',h,'di',matrixdata.shape[0]

dove per ogni riga di una matrice vado a compiere una trasformata 
wavelet unidimensionale dalla quale si ottene (getdata) una matrice 
(NxM). Questa, con alcune operazioni, va rieaborata per ottenere una 
nuova riga (vettore) che deve prendere, in una nuova matrice (fase), la 
stessa posizione che aveva la riga di origine.

Questa procedura va fatta per ogni riga della matrice di pertenza con lo 
scopo di ottenere una seconda matrice (trasformata) di identiche dimensioni.

Avrei bisogno di aumentare un pochino le prestazioni, adesso la 
rielaborazione di una matrice 1024 x 1024 ci mette un paio di minuti. In 
realtà l'operazione wavelet è molto veloce.... è la riassegnazione col 
secondo ciclo for che "ruba molto tempo".

Per questo vi vorrei chiedere se conoscete tecniche o metodi  per 
ovviare ai due cicli (qualsiasi proposta di ottimizzazione del codice è 
ben accetta)
Grazie
Matteo P


Maggiori informazioni sulla lista Python