Понимание concurrent.futures.Executor.map()

Я пытаюсь распараллелить некоторый код Python, используя процессы и concurrent.futures. Похоже, я могу выполнять функцию несколько раз параллельно либо с помощью отправка вызовов и последующий вызов Future.result() на фьючерсах или с помощью Executor.map().
Мне интересно, является ли последнее просто синтаксическим сахаром для первого и есть ли разница в производительности. Из документации это не кажется очевидным.


person planetp    schedule 27.01.2017    source источник


Ответы (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().

person Sun Bear    schedule 12.02.2017