Sto tentando di eseguire un semplice test utilizzando il multiprocessing. Il test funziona bene fino a quando non importa numpy (anche se non è usato nel programma). Ecco il codice:Multiprocessing incompatibile con NumPy
from multiprocessing import Pool
import time
import numpy as np #this is the problematic line
def CostlyFunc(N):
""""""
tstart = time.time()
x = 0
for i in xrange(N):
for j in xrange(N):
if i % 2: x += 2
else: x -= 2
print "CostlyFunc : elapsed time %f s" % (time.time() - tstart)
return x
#serial application
ResultList0 = []
StartTime = time.time()
for i in xrange(3):
ResultList0.append(CostlyFunc(5000))
print "Elapsed time (serial) : ", time.time() - StartTime
#multiprocessing application
StartTime = time.time()
pool = Pool()
asyncResult = pool.map_async(CostlyFunc, [5000, 5000, 5000])
ResultList1 = asyncResult.get()
print "Elapsed time (multiporcessing) : ", time.time() - StartTime
Se non importare numpy il risultato è:
CostlyFunc : elapsed time 2.866265 s
CostlyFunc : elapsed time 2.793213 s
CostlyFunc : elapsed time 2.794936 s
Elapsed time (serial) : 8.45455098152
CostlyFunc : elapsed time 2.889815 s
CostlyFunc : elapsed time 2.891556 s
CostlyFunc : elapsed time 2.898898 s
Elapsed time (multiporcessing) : 2.91595196724
il tempo totale trascorso è simile al tempo necessario per 1 processo, il che significa che il calcolo è stato parallelizzati. Se faccio importare numpy il risultato diventa:
CostlyFunc : elapsed time 2.877116 s
CostlyFunc : elapsed time 2.866778 s
CostlyFunc : elapsed time 2.860894 s
Elapsed time (serial) : 8.60492110252
CostlyFunc : elapsed time 8.450145 s
CostlyFunc : elapsed time 8.473006 s
CostlyFunc : elapsed time 8.506402 s
Elapsed time (multiporcessing) : 8.55398178101
Il tempo totale trascorso è la stessa per entrambi i metodi di serie e di multiprocessing, perché un solo core viene utilizzato. È chiaro che il problema deriva da Numpy. È possibile che io abbia un'incompatibilità tra le mie versioni di multiprocessing e NumPy?
Attualmente sto usando Python2.7, NumPy 1.6.2 e multiprocessing 0.70a1 su linux
Questo è molto strano: sembra funzionare bene su OSX con Python 2.7 e NumPy 1.7. Dai tempi sembra che siano utilizzati tre core, ma il tempo di elaborazione è rallentato- puoi confermarlo? – Daniel
Grazie per la risposta. Sono abbastanza sicuro che il calcolo sia effettuato su 1 solo core quando importo NumPy (ho controllato con mpstat (http://linuxcommand.org/man_pages/mpstat1.html)). Sembra che lo stesso core calcoli i 3 lavori contemporaneamente: quindi ogni lavoro richiede ~ 8.5 sec ma il tempo totale è anche ~ 8.5 sec. – user2660966
Ho provato con numpy 1.6.1, numpy 1.6.2 e numpy 1.7.1 ... stesso problema – user2660966