Multiprocessing.Pool замедляет умножение матрицы Numpy

Итак, я играю сmultiprocessing.Pool а такжеNumpy, но, похоже, я упустил какой-то важный момент. Почемуpool версия намного медленнее? я смотрел наhtop и я вижу, как создаются несколько процессов, но все они совместно используют один из процессоров, добавляя до ~ 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

[Обновить]

изменился наtimeit для бенчмаркинга процессовinit Pool с несколькими моими ядрамиизменил вычисления так, чтобы было больше вычислений и меньше передачи памяти (я надеюсь)

Все еще без изменений.pool версия все еще медленнее, и я вижу вhtop что используется только одно ядро и порождаются несколько процессов.

[Update2]

В данный момент я читаю о @ Jan-Philip Gehrcke 'предложение использоватьmultiprocessing.Process() а такжеQueue, Но в то же время я хотел бы знать:

Почему мой пример работает на Тиаго? Что может быть причиной того, что она не работает на моей машине1?Является ли в моем примере кода какое-либо копирование между процессами? Я хотел, чтобы мой код давал каждому потоку одну матрицу из списка матриц.Является ли мой код плохим примером, потому что я использую?Numpy

Я узнал, что часто один получает лучший ответ, когда другие знают мою конечную цель так: у меня много файлов, которые загружаются и обрабатываются последовательно. Обработка сильно загружает процессор, поэтому я полагаю, что многое можно получить за счет распараллеливания. Моя цель - вызвать функцию python, которая анализирует файл параллельно. Более того, я полагаю, что эта функция является просто интерфейсом для кода на языке C.

 Ubuntu 12.04, Python 2.7.3, i7 860 @ 2.80 - Пожалуйста, оставьте комментарий, если вам нужна дополнительная информация.

[Update3]

Вот результаты от Стефано 'Пример кода. По какой-то причине нет ускорения. : /

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

[обновление 4] ответ наЯн-Филипп Геркекомментарий

Прости что у меня нетЯ прояснил себя. Как я писал в обновлении 2, моя главная цель - распараллелить многие последовательные вызовы сторонней библиотеки функций Python. Эта функция является интерфейсом к некоторому C-коду. Мне порекомендовали использоватьPool, но это нет, я попробовал что-то попроще, показанный выше пример сnumpy, Но и там я не смог добиться улучшения производительности, хотя он и ищет меня »смущающий распараллеливание`. Поэтому я предполагаю, что, должно быть, пропустил что-то важное. Эта информация - то, что я ищу с этим вопросом и щедростью.

[обновление 5]

Спасибо за ваш огромный вклад. Но чтение ваших ответов только создает для меня больше вопросов. По этой причине я буду читать оосновы и создавать новые вопросы SO, когда у меня есть более четкое понимание того, что я не делаюя знаю

Ответы на вопрос(7)

Ваш ответ на вопрос