[Python] Utilizzo completo della cpu

Gianfranco Durin g.durin a inrim.it
Dom 20 Nov 2011 18:58:19 CET


[..skip... ]
> > Ho la funzione fp  del tipo numeratore/denominatore dove numeratore
> > e
> > denominatore sono dei polinomi di secondo grado.
> > 
> > Proverò con il suggerimento di usare la def al posto di lambda (può
> > aiutare per le prestazioni?)
> > 
> 
> Credo che potrebbe farti guadagnare un massimo del 10%.
> Se il tempo impiegato è ancora troppo lungo, l'unico consiglio che
> posso
> darti è di riscrivere il tutto in C.
> Per il tuo problema si trovano diverse implementazioni in C, vedi ad
> esempio:
> http://en.wikipedia.org/wiki/Levenberg–Marquardt_algorithm
> 
> Purtroppo il tuo è un caso abbastanza "sfortunato".
> L'implementazione dell'algoritmo in SciPy è un semplice wrapper di
> una
> funzione scritta in Fortran (minpack), e che quindi dovrebbe essere
> abbastanza efficiente.
> 
> Il problema è che viene chiamata la tua funzione, scritta in Python,
> moltissime volte all'interno di un ciclo.
> Le chiamate a funzione in Python sono abbastanza onerose; di solito
> non è un problema ma nel tuo caso lo è.
> 

Non solo la chiamata alla funzione e' un po' onerosa ma soprattutto direi e' oneroso il calcolo della jacobiano fatto per via numerica. Per questo suggerisco l'uso di numexpr (http://code.google.com/p/numexpr/) che offre la possibilita' di precompilare la funzione (e le sue derivate, se analitiche) per velocizzare il calcolo. Questo nel mio codice che suggerito precedentemente e' gia' implementato. 
Mi accorgo ora che proprio numexpr ha la possibilità di usare piu' core: i dettagli qui 
http://code.google.com/p/numexpr/wiki/MultiThreadVM

ciao
gianfranco


Maggiori informazioni sulla lista Python