Python многопроцессорная обработка itertools для двух списков

#python #multiprocessing #itertools

#python #многопроцессорная обработка #python-itertools

Вопрос:

Есть ли простой способ в Python 3 выполнить итерацию по произведению из другого списка и использовать многопроцессорную обработку.Объедините, чтобы ускорить вычисления?

Код для последовательного вычисления выглядит следующим образом:

 from itertools import product

data1 = [1,2,3,4]
data2 = ['a', 'b', 'c', 'd']

def main():
    for element in product(zip(data1, data2), repeat = 2):
        print(element)

if __name__ == '__main__':
    main()

Output:
(1, a),(1, a)
(1, a),(2, b)
(1, a),(3, c)
(1, a),(4, d)

(2, b),(1, a)
(2, b),(2, b)
(2, b),(3, c)
(2, b),(4, d)
...
  

Теперь я знаю, что могу использовать многопроцессорную обработку.Пул для параллельной итерации по произведению (нескольких) списков, но он поддерживает только один повторяющийся аргумент:

 import multiprocessing
from itertools import product

data1 = [1,2,3,4]
data2 = ['a', 'b', 'c', 'd']

def func(myfunc):
    return myfunc

if __name__ == '__main__':
    with multiprocessing.Pool(4) as pool:
        pool.map(func, product(data1 ,repeat = 2))
  

Поскольку я хочу добавить data2 и использовать все процессоры для дальнейших вычислений, я попробовал несколько других функций, таких как multiprocessing.starmap и functools. Ни один из них не работал для меня.

Мой вопрос в том, есть ли у вас простое решение для этой проблемы, или мне нужно думать «из коробки» и определять специальные процессы для каждого шага. Я надеялся решить эту проблему с помощью многопроцессорной обработки.Объедините, поскольку не имеет значения, в каком порядке выполняются вычисления.

Спасибо.

Комментарии:

1. Мне не совсем ясно, что именно вы просите из-за пользователя zip для data1 и data2 в первом примере кода. В чем именно проблема с использованием Pool ? Вы получаете сообщение об ошибке? Какой результат вы получаете в сравнении с тем, какой результат вы хотите?

2. Ну, каким-то образом я понял, что это работает и с zip: pool.map(func, product(zip(data1, data2), repeat = 2)) Мой вопрос в том, есть ли другой способ? Мне как-то нужна ускоренная реализация. Когда я time выполняю вычисления, это происходит всего на 20-30% быстрее с большим количеством пулов, чем 1.

3. Когда вы говорите «больше пулов», что вы имеете в виду? Больше процессов в одном пуле?

4. Да, я имел в виду больше процессов в пуле (4 или выше)