Я пытаюсь использовать некоторую многопроцессорную обработку с помощью python, чтобы увеличить скорость некоторой функции, я знаю, что создание процесса имеет большую стоимость, но моя функция принимает что-то за 3 секунды для выполнения в последовательный, поэтому я думал, что некоторая многопроцессорная обработка может сделать трюк.Многопроцессор медленнее, чем последовательный Python 3.5
Я ошибался (большой крик), многопроцессорность кажется медленнее или, по крайней мере, не быстрее. Чтобы поместить некоторый контекст здесь, что у меня был до многопроцессорной обработки:
for i in range(0, 3):
for j in range(0, 3):
result = my_function(my_args)
А теперь то, что я с многопроцессорной обработкой:
pool = Pool()
for i in range(0, 3):
for j in range(0, 3):
result = pool.apply_async(my_function,my_args).get()
pool.close()
pool.join()
я заменить реальную функцию с My_function штуковиной, потому что моя функция - боль в заднице, чтобы читать в основном.
То есть рабочая нагрузка на малую, чтобы использовать многопроцессорную обработку, или я что-то не так?
EDIT:
Как некоторые говорили, что работал последовательный, потому что я использовал получить каждый раз, когда мне нужно, чтобы использовать его в конце после того, как присоединиться, но теперь у меня есть случайное исключение, выскочить время от времени, здесь конец TRACEBACK:
Файл "/home/rtodo/anaconda3/lib/python3.5/multiprocessing/pool.py", строка 608, в прибудете повышают self._value IndexError: поп указательным из диапазон
вот мой код исправлен
pool = Pool()
for i in range(0, 3):
for j in range(0, 3):
neigbhourhood[i][j] = pool.apply_async(my_function,my_args)
for k in range(0, 3):
for l in range(0, 3):
neigbhourhood[i][j] = neigbhourhood[i][j].get()
pool.close()
Где neigbhourhood представляет собой массив 3x3.
Редактирование: Я немного изменил код, теперь пул закрывается после get и я не использую join.
Какой процессор и ОС вы используете? Кроме того, действительно ли этот код выполняет вызовы функций в параллели? Я думаю, что он будет запускать его последовательно, поскольку он, кажется, дождался результата перед запуском следующего вызова. – skyking
Вы не должны сначала называть 'get()'. Вы вызываете 'get()' после выполнения всех заданий. Таким образом, вы запускаете все подряд, как сказал skyking. – justhalf
Я на Debian, и у меня есть Intel Core i3-4005U 1,7 ГГц, поскольку вызовы функций работают в параллельном режиме. Я честно понятия не имею, я не знаком с многопроцессорной обработкой на python, поэтому я не знаю, делать это таким образом - это правильный способ сделать некоторые параллели. –