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
, Но в то же время я хотел бы знать:
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, когда у меня есть более четкое понимание того, что я не делаюя знаю