[Python] Utilizzo completo della cpu

Manlio Perillo manlio.perillo a gmail.com
Ven 18 Nov 2011 21:23:26 CET


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 18/11/2011 09:06, Matteo Perini ha scritto:
> 
> ho una funzione fp non lineare che deve essere ottimizzata...
> fp = lambda v, x,y,
> phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2...
> +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi...
> 
> 
> +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2...
> 
> 
> +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y)
> 
> [...]
> Questo punto mi interessa molto e ci avevo già pensato ma non avevo
> trovato il modo di semplificare.
> 

http://paste.pocoo.org/show/509927/

Ma attenzione che potrebbe contenere degli errori.

> 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 dovrebbe essere un problema riscrivere parte del codice in C e
misurare di quanto migliorano le prestazioni.
Magari mi sbaglio ed il collo di bottiglia non è dove io penso che sia.

> [...]

Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk7Gvr4ACgkQscQJ24LbaUQgywCeKp/VGVX72waz3LZQMqympFws
RT0AnAkNxxhYuVXY7j3fYK/ICdqz3EsN
=TLaS
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python