Próbuję uruchomić prosty test przy użyciu wieloprocesowości. Test działa dobrze, dopóki nie zaimportuję numpy (mimo że nie jest używany w programie). Oto kod:Wieloprocesorowość niekompatybilna z 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
Jeśli nie importować numpy wynik to:
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
Łączny czas, jaki upłynął, jest podobny do czasu wymaganego przez 1 procesu, co oznacza, że obliczenia były zrównoleglone. Jeśli robię import numpy wynik staje:
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
Całkowity czas jaki upłynął jest taka sama dla obu metod szeregowych i wieloprocesorowych, ponieważ tylko jeden rdzeń jest używany. Jest oczywiste, że problem pochodzi od numpy. Czy jest możliwe, że mam niekompatybilność między moimi wersjami wieloprocesowymi a NumPy?
Obecnie używam Python2.7, NumPy 1.6.2 i wieloprocesorowe 0.70a1 na linux
To bardzo dziwne - Wygląda na to, że działa dobrze na OSX z Pythonem 2.7 i NumPy 1.7. Od czasu wygląda na to, że trzy rdzenie są używane, ale czas przetwarzania jest spowolniony - czy możesz to potwierdzić? – Daniel
Dziękuję za odpowiedź. Jestem pewien, że obliczenia są dokonywane tylko na 1 rdzeniu, gdy importuję NumPy (sprawdziłem przy pomocy mpstat (http://linuxcommand.org/man_pages/mpstat1.html)). Wygląda na to, że ten sam rdzeń oblicza 3 zadania w tym samym czasie: więc każde zadanie zajmuje ~ 8,5 sekundy, ale całkowity czas wynosi również ~ 8,5 sekundy. – user2660966
Próbowałem z numpy 1.6.1, numpy 1.6.2 i numpy 1.7.1 ... ten sam problem – user2660966