Итак, я играю с 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
версия все еще медленнее, и я вижу в htop
, что используется только одно ядро, также генерируется несколько процессов.
[Update2]
На данный момент я читаю о том, как @Jan-Philip Gehrcke предлагает использовать multiprocessing.Process()
и Queue
. Но тем временем я хотел бы знать:
- Почему мой пример работает на tiago? Что может быть причиной того, что он не работает на моей машине 1?
- Является ли в моем примере кодом любое копирование между процессами? Я намеревался, чтобы мой код дал каждому потоку одну матрицу списка матриц.
- Мой код плохой пример, потому что я использую
Numpy
?
Я узнал, что часто получается лучший ответ, когда другие знают мою конечную цель: у меня много файлов, которые загружаются и обрабатываются в серийном режиме. Обработка - интенсивность процессора, поэтому я предполагаю, что многое может быть достигнуто путем распараллеливания. Моя цель - вызвать функцию python, которая анализирует файл параллельно. Кроме того, эта функция является просто интерфейсом к C-коду, я полагаю, это имеет значение.
1 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
. Но и там я не мог добиться улучшения производительности, даже если он ищет меня "emberassing parallelizable". Поэтому я предполагаю, что, должно быть, я пропустил что-то важное. Эта информация - это то, что я ищу с этим вопросом и щедростью.
[обновление 5]
Спасибо за ваш огромный вклад. Но чтение ваших ответов только создает для меня больше вопросов. По этой причине я прочитаю об основах и создаю новые вопросы SO, когда у меня будет более четкое понимание того, чего я не знаю.