Я пытаюсь распараллелить некоторый код Python, используя процессы и concurrent.futures
. Похоже, я могу выполнять функцию несколько раз параллельно либо с помощью отправка вызовов и последующий вызов Future.result()
на фьючерсах или с помощью Executor.map()
.
Мне интересно, является ли последнее просто синтаксическим сахаром для первого и есть ли разница в производительности. Из документации это не кажется очевидным.
Понимание concurrent.futures.Executor.map()
Ответы (1)
Это позволит вам выполнять функцию несколько раз одновременно вместо истинного параллельного выполнения.
Что касается производительности, я недавно обнаружил, что ProcessPoolExecutor.submit()
и ProcessPoolExecutor.map()
потребляют одинаковое количество вычислительного времени для выполнения одной и той же задачи. Примечание. .submit()
возвращает объект будущего (назовем его f), и вам нужно использовать его параметр f.result
, чтобы увидеть его результат. С другой стороны, .map()
напрямую возвращает итератор.
При преобразовании их результатов в упорядоченный список с использованием метода сортировки я обнаружил, что время вычисления всего кода .map()
может быть быстрее, чем всего кода .submit()
в определенных сценариях.
При преобразовании их результатов в неупорядоченный список с помощью метода list время вычисления всех кодов .submit()
и .map()
одинаково. Кроме того, эти коды работали быстрее, чем коды, использующие отсортированный метод.
Вы можете прочитать подробности в моем ответе. Там я также поделился своими кодами, где вы можете увидеть, как они работают. Я надеюсь, что они могут быть вам полезны.
Я не использовал ThreadPoolExecutor
, поэтому не могу подробно комментировать. Однако я читал, что они реализованы так же, как ProcessPoolExecutor
, и они больше подходят для задач, связанных с вводом-выводом, а не задач, связанных с процессором. Вам нужно указать аргумент max_workers
, т. е. максимальное количество потоков, тогда как в ProcessPoolExecutor
max_workers
— необязательный аргумент, который по умолчанию равен количеству ЦП, возвращаемому os.cpu_count()
.