[Python] Utilizzo completo della cpu

Daniele Varrazzo piro a develer.com
Gio 17 Nov 2011 18:50:39 CET


On Thu, 17 Nov 2011 17:19:12 +0100, Matteo Perini
<perini.matteo a gmail.com>
wrote:
> Ciao lista,
> Vorrei sapere se è possibile utilizzare tutti i core della cpu per 
> eseguire calcoli gravosi.
> Ho guardato un po' in internet e  come risposta ho trovato il 
> multithreading che ho già utilizzato un paio di volte.
> Però non riesco a capire se è possibile applicarlo anche ad un unico 
> comando.

Non credo nel tuo caso. Il codice python in linea di massima non può
essere eseguito in multithread, nel senso che l'interprete può esegure un
solo opcode alla volta. Ma se questo opcode "è lungo di suo", per esempio
legge da un file, o dalla rete, o fa qualcosa di complesso ma restando in
C, senza toccare pezzi di python, allora può "rilasciare il GIL" e
permettere ad altri thread di correre in parallelo. Di conseguenza, un
programma python può beneficiare di multithread solo quando è IO-bound, non
quando è CPU-bound, e il tempo di CPU è speso in codice Python.

Nota che - se ricordo bene - numpy rilascia il GIL per le operazioni
implementate in C, ovvero, se fai A + B dove A e B sono matrici 10000 x
10000, mentre le somma può permettere ad altro codice (python o meno) di
correre. Ma la funzione leastsq, anche se è scritta in C, valuta
continuamente la fp che, essendo scritta in Python, ha bisogno di aspettare
il GIL per essere eseguita.

Al di là della prestazione di Python coi thread, non credo che la leastsq
sia parallelizzabile: se non dico cappellate, l'algoritmo consiste in
valutare continuamente la funzione in un numero di punti e ogni valutazione
ha bisogno dei risultati precedenti, quindi non mi sembra un problema
adatto ad essere parallelizzato.


-- 
Daniele Varrazzo - Develer S.r.l. 
http://www.develer.com


Maggiori informazioni sulla lista Python