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ć:

Dlaczego mój przykład działa dla tiago? Jaki może być powód, dla którego nie działa na moim komputerze1?Czy w moim przykładzie koduje się kopiowanie między procesami? Zamierzałem, aby mój kod nadawał każdemu wątkowi jedną macierz listy macierzy.Czy mój kod jest złym przykładem, ponieważ używamNumpy?

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.

questionAnswers(7)

yourAnswerToTheQuestion