Введение
В этом посте я покажу, что вы можете сделать, чтобы отобразить функцию, которая ожидает нескольких аргументов.
Есть несколько способов сделать это, и они работают не только для регулярных карта
Функция, вы также можете использовать трюк для передачи нескольких параметров для Execututor.map
от chapulent.futures
и Многопроцессор. Бассейн
Отказ
Оглавление
Проблема с картой () Функция
1.1. Решение 1 – сопоставление нескольких аргументов с iTertools.Starmap ()
1.2. Решение 2 – Использование Functools. Расположенный на «Замораживание» аргументы
1.3. Решение 3 – сопоставление нескольких аргументов «повторять» их
Проблема 2: Передача нескольких параметров для многопроцессорного пула.
2.1. Использование Pool.Starmap
2.2. Использование частичных ()
Проблема 3: Как пройти несколько аргументов в параллельные фьючерсы ProcessPoolExecutor (или ThreadPoolexecuture)?
3.1. Использование частичных ()
3.2. Использование повторения ()
Вывод
Проблема с картой () Функция
Давайте представим, что у вас есть функция называется sum_four
Это занимает 4 аргумента и возвращает их сумму.
>>> def sum_four(a, b, c, d): return a + b + c + d
Давайте также предположим, что вы решаете очень конкретную проблему, требующую исправления первых 3 аргументов. В этой проблеме вы хотите сравнить, как функция ведет себя, когда вы отличаетесь только последним параметром.
>>> a, b, c = 1, 2, 3 >>> sum_four(a=a, b=b, c=c, d=1) 7 >>> sum_four(a=a, b=b, c=c, d=2) 8 >>> sum_four(a=a, b=b, c=c, d=3) 9 >>> sum_four(a=a, b=b, c=c, d=4) 10
Теперь скажем, что вы хотите использовать карта
, потому что вам нравится функциональное программирование, или, возможно, потому что вы поступаете с языка, который поощряет эту парадигму.
Так как только D
варьируется, мы могли бы хранить все потенциальные значения для D
Мы хотим проверить в списке, как этот all_d_values = [1, 2, 3, 4]
.
Проблема, учитывая функцию и список одного элемента, если вы хотите пройти этот список для карта
функция И это займет только один элемент, что вы можете сделать?
Решение 1 – сопоставление нескольких аргументов с iTertools.Starmap ()
Первое решение для не Принять карта
функция, но использовать Itertools.Starmap
вместо. Эта функция возьмет функцию в качестве аргументов и итеративных кортежей. Тогда, Starmap
Будет ли передать каждый кортеж T
и вызвать функцию, распаковывая аргументы, как этот Для T в корзах: функция (* T)
Отказ
Чтобы сделать все более четкими, рассмотрите следующий пример.
>>> import itertools >>> all_d_values = [1, 2, 3, 4] >>> items = ((a, b, c, d) for d in all_d_values) >>> list(items) [(1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4)] >>> list(itertools.starmap(sum_four, items)) [7, 8, 9, 10]
Как видите, есть много повторений, которое может неизбежно потреблять много памяти, если список большой. Улучшить, что я сделал предметы
Как генератор, таким образом мы удерживаем только в памяти элемент, который мы будем обрабатывать.
Решение 2 – Использование Functools. Расположенный на «Замораживание» аргументы
Второе решение – использовать карри и создать новую частичную функцию. Согласно документам, частичный ()
Будет «заморозить» часть аргументов функции и/или ключевых слов ключевых слов, приводящих к новой функции с упрощенной подписью.
>>> import functools >>> partial_sum_four = functools.partial(sum_four, a, b, c) >>> partial_sum_four(3) 9 >>> list(map(partial_sum_four, all_d_values)) [7, 8, 9, 10]
Решение 3 – сопоставление нескольких аргументов «повторять» их
Третья альтернатива – использовать Itertools.repeat ()
Отказ
Эта функция производит итератор, который возвращает объект снова и снова. Он будет работать бесконечно, если вы не укажете аргумент Times.
Если мы посмотрим посмотрите на карта ()
‘s Подпись он принимает функцию и несколько повторных документов, Карта (Функция, Итализация, ...)
.
Согласно его описанию,
Если пройдены дополнительные истеренные аргументы, функция должна взять на себя много аргументов и применяется к элементам из всех ейсталов параллельно. С несколькими порталками итератор останавливается, когда самая коротча утончена.
Бинго! Мы можем сделать А
, b
и C
Infitnite Iterable, используя Itertools.repeat ()
Отказ Как только all_d_values
исчерпан, что является самым коротким истеченным, карта ()
остановится.
>>> import itertools >>> list(map(sum_four, itertools.repeat(a), itertools.repeat(b), itertools.repeat(c), all_d_values)) [7, 8, 9, 10]
Чтобы поставить его другим способом, используя повторить ()
примерно эквивалентен:
>>> list(map(sum_four, [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], all_d_values)) [7, 8, 9, 10]
Вам не нужно слишком беспокоиться о памяти как повторить
производит элементы на ходу. На самом деле, это возвращает ReptObject
, не Список
[REF] Отказ
Проблема 2: Передача нескольких параметров для многопроцессорного пула.
Эта проблема очень похожа на использование обычного карта ()
Отказ Единственное отличие состоит в том, что нам нужно пройти несколько аргументов на карту у бассейна многопроцессора.
Предположим, что мы хотим ускорить наш код и запустить sum_four
параллельно с использованием процессов.
Хорошая новость в том, что вы можете использовать решения выше, с одним исключением: Pool.map
принимает только один потенциал. Это означает, что мы не можем использовать повторить ()
здесь. Давайте посмотрим на альтернативы.
Использование Pool.Starmap
Бассейн
класс от Многопроцессор
Модуль реализует A Starmap
Функция, которая работает так же, как и его аналог из Itertools
модуль.
>>> from multiprocessing import Pool >>> import itertools >>> def sum_four(a, b, c, d): return a + b + c + d >>> a, b, c = 1, 2, 3 >>> all_d_values = [1, 2, 3, 4] >>> items = [(a, b, c, d) for d in all_d_values] >>> items [(1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4)] >>> with Pool(processes=4) as pool: res = pool.starmap(sum_four, items) >>> res [7, 8, 9, 10]
Использование частичных ()
Как альтернатива, мы также можем положиться на хорошее частичный
функция.
>>> import functools >>> partial_sum_four = functools.partial(sum_four, a, b, c) >>> with Pool(processes=4) as pool: res = pool.map(partial_sum_four, all_d_values) >>> res [7, 8, 9, 10]
Проблема 3: Как пройти несколько аргументов для одновременных фьючерсов. MAP?
chapulent.futures
Модуль обеспечивает интерфейс высокого уровня под названием Исполнитель
проводить кабинет асинхронно.
Есть две разные реализации, A ThreadPoolexecutor
и а ProcessPoolExecutor
Отказ
Вопреки Многопроцессор. Бассейн
, а Исполнитель
не имеет startmap ()
функция. Тем не менее, его карта ()
Реализация поддерживает несколько повторных документов, которые позволяют нам использовать повторить ()
Отказ Еще одна разница в том, что Execututor.map
Возвращает генератор, а не список.
Использование частичных () с ProcessPoolexecuture (или ThreadPoolexecuture)
Путем «замораживания» аргументов, использующих частичный
Мы используем карта
Метод от ProcessPoolExecutor
Как обычная функция карты. Поскольку они оба имеют один и тот же интерфейс, вы можете сделать то же самое взаимозаменяемо с ThreadPoolexecutor
>>> from concurrent.futures import ProcessPoolExecutor >>> import functools >>> def sum_four(a, b, c, d): return a + b + c + d >>> a, b, c = 1, 2, 3 >>> all_d_values = [1, 2, 3, 4] >>> partial_sum_four = functools.partial(sum_four, a, b, c) >>> with ProcessPoolExecutor(max_workers=4) as pool: res = list(pool.map(partial_sum_four, all_d_values)) >>> res [7, 8, 9, 10]
Использование повторения ()
Опять же, мы можем просто использовать Itertools.repeat
Чтобы выполнить работу, как предыдущие решения.
>>> from concurrent.futures import ProcessPoolExecutor >>> from itertools import repeat >>> def sum_four(a, b, c, d): return a + b + c + d >>> a, b, c = 1, 2, 3 >>> all_d_values = [1, 2, 3, 4] >>> with ProcessPoolExecutor(max_workers=4) as pool: res = list(pool.map(sum_four, repeat(a), repeat(b), repeat(c), all_d_values)) >>> res [7, 8, 9, 10]
Вывод
Вот и сегодня, ребята! Я надеюсь, вы узнали что-то другое и полезное. карта ()
Функция делает Python чувствовать себя как функциональный язык программирования. карта ()
Доступно не только как встроенная функция, но и как методы в Многопроцессор
и chapulent.futures
модуль. В этой статье я показал, что я делаю для карты функций, которые принимают несколько аргументов.
Другие сообщения могут понравиться:
- Как использовать datetime.timedelta в Python с примерами
- 73 Примеры, чтобы помочь вам овладеть F-струнами Python
- Как проверить, поднимается ли исключение (или нет) с Pтой
- 3 способа тестирования клиентских приложений API в Python
- Все, что вам нужно знать о NamedTtues Python
- Лучший способ сравнить два словари в Python
- 5 скрытых функций Python, которые вы, вероятно, никогда не слышали о
Этот пост был изначально опубликован в https://miguendes.me/how-to-pass-multiple-arguments-to-a-map-function-in-python.
Увидимся в следующий раз!
Оригинал: “https://dev.to/miguendes/how-to-pass-multiple-arguments-to-a-map-function-in-python-23hf”