Рубрики
Без рубрики

Как пройти несколько аргументов на функцию карты в Python

Введение В этом посте я собираюсь показать, что вы можете сделать, чтобы сопоставить функцию, которая … Tagged Python, Учебник, начинающие.

Введение

В этом посте я покажу, что вы можете сделать, чтобы отобразить функцию, которая ожидает нескольких аргументов.

Есть несколько способов сделать это, и они работают не только для регулярных карта Функция, вы также можете использовать трюк для передачи нескольких параметров для Execututor.map от chapulent.futures и Многопроцессор. Бассейн Отказ

Оглавление

  1. Проблема с картой () Функция

    1.1. Решение 1 – сопоставление нескольких аргументов с iTertools.Starmap ()

    1.2. Решение 2 – Использование Functools. Расположенный на «Замораживание» аргументы

    1.3. Решение 3 – сопоставление нескольких аргументов «повторять» их

  2. Проблема 2: Передача нескольких параметров для многопроцессорного пула.

    2.1. Использование Pool.Starmap

    2.2. Использование частичных ()

  3. Проблема 3: Как пройти несколько аргументов в параллельные фьючерсы ProcessPoolExecutor (или ThreadPoolexecuture)?

    3.1. Использование частичных ()

    3.2. Использование повторения ()

  4. Вывод

Проблема с картой () Функция

Давайте представим, что у вас есть функция называется 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 модуль. В этой статье я показал, что я делаю для карты функций, которые принимают несколько аргументов.

Другие сообщения могут понравиться:

Этот пост был изначально опубликован в 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”