Multiprocessing.Pool sprawia, że mnożenie macierzy Numpy jest wolniejsze
Więc bawię sięmultiprocessing.Pool
iNumpy
, ale wydaje mi się, że przegapiłem jakiś ważny punkt. Dlaczego jestpool
wersja znacznie wolniejsza? spojrzałem nahtop
i widzę kilka procesów, ale wszystkie dzielą jeden procesor sumujący się do ~ 100%.
$ cat test_multi.py
import numpy as np
from timeit import timeit
from multiprocessing import Pool
def mmul(matrix):
for i in range(100):
matrix = matrix * matrix
return matrix
if __name__ == '__main__':
matrices = []
for i in range(4):
matrices.append(np.random.random_integers(100, size=(1000, 1000)))
pool = Pool(8)
print timeit(lambda: map(mmul, matrices), number=20)
print timeit(lambda: pool.map(mmul, matrices), number=20)
$ python test_multi.py
16.0265390873
19.097837925
[aktualizacja]
zmienić natimeit
dla procesów benchmarkinguinicjuj pulę z wieloma moimi rdzeniamizmieniono obliczenia, aby było więcej obliczeń i mniej transferu pamięci (mam nadzieję)Wciąż bez zmian.pool
wersja jest wciąż wolniejsza i mogę zobaczyćhtop
że używany jest tylko jeden rdzeń, powstaje również kilka procesów.
[update2]
W tej chwili czytam o sugestii @ Jan-Philipa Gehrcke, aby użyćmultiprocessing.Process()
iQueue
. Ale w międzyczasie chciałbym wiedzieć:
Numpy
?Dowiedziałem się, że często można uzyskać lepszą odpowiedź, gdy inni znają mój cel końcowy, więc: mam dużo plików, które są ładowane i przetwarzane w sposób seryjny. Przetwarzanie jest intensywne, więc zakładam, że wiele można uzyskać dzięki równoległości. Moim celem jest wywołanie funkcji python, która równolegle analizuje plik. Ponadto ta funkcja jest tylko interfejsem do kodu C, jak sądzę, to robi różnicę.
1 Ubuntu 12.04, Python 2.7.3, i7 860 @ 2,80 - Proszę zostawić komentarz, jeśli potrzebujesz więcej informacji.
[update3]
Oto wyniki z przykładowego kodu Stefano. Z jakiegoś powodu nie ma przyspieszenia. : /
testing with 16 matrices
base 4.27
1 5.07
2 4.76
4 4.71
8 4.78
16 4.79
testing with 32 matrices
base 8.82
1 10.39
2 10.58
4 10.73
8 9.46
16 9.54
testing with 64 matrices
base 17.38
1 19.34
2 19.62
4 19.59
8 19.39
16 19.34
[aktualizacja 4] odpowiedź naKomentarz Jana-Philipa Gehrcke
Przepraszam, że się nie wyjaśniłem. Jak pisałem w aktualizacji 2, moim głównym celem jest zrównoleglenie wielu wywołań szeregowych funkcji biblioteki Pythona innej firmy. Ta funkcja jest interfejsem do pewnego kodu C. Polecono mi używaćPool
, ale to nie zadziałało, więc spróbowałem czegoś prostszego, pokazanego powyżej przykładu znumpy
. Ale także nie udało mi się osiągnąć poprawy wydajności, chociaż wygląda na to, że „równoległa synchronizacja”. Zakładam więc, że coś przeoczyłem. Ta informacja jest tym, czego szukam z tym pytaniem i nagrodą.
[aktualizacja 5]
Dzięki za cały twój ogromny wkład. Ale czytanie twoich odpowiedzi tworzy dla mnie więcej pytań. Z tego powodu przeczytam opodstawy i stwórz nowe pytania SO, gdy będę miał lepsze zrozumienie tego, czego nie wiem.