Как распараллелить умножение 2 элементов во вложенном списке - PullRequest
0 голосов
/ 06 марта 2020

Как распараллелить умножение 2 элементов во вложенном списке. ie если мой список:

lst = [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]

Вывод, который я хочу получить:

[1, 2, 3, 2, 4, 6, 3, 6, 9]

, где 1 * 1 = 1, 1 * 2 = 2, 1 * 3 = 3, 2 * 1 = 2 и т. Д.

У меня есть следующий код:

from itertools import product
from joblib import Parallel, delayed

lst = (list(a) for a in product([1, 2, 3], repeat=2))

results = Parallel(n_jobs=-1)(delayed(x*y for x, y in lst))
results

Но этот код выдает мне ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-60-68b5134d22bd> in <module>
----> 1 results = Parallel(n_jobs=-1)(delayed(x*y for x, y in lst))
      2 results

~\Anaconda3\lib\site-packages\joblib\parallel.py in __call__(self, iterable)
    964         if hasattr(self._backend, 'start_call'):
    965             self._backend.start_call()
--> 966         iterator = iter(iterable)
    967         pre_dispatch = self.pre_dispatch
    968 

TypeError: 'function' object is not iterable

1) Где я ошибся?

2) Как это исправить?

1 Ответ

0 голосов
/ 06 марта 2020

Это то, что вам нужно сделать:

from concurrent.futures import ProcessPoolExecutor

lst = [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]]


def multiply(numbers):
    return numbers[0] * numbers[1]


with ProcessPoolExecutor() as pool:
    results = [result
               for result
               in pool.map(multiply, lst)]

print(results)
# [1, 2, 3, 2, 4, 6, 3, 6, 9]
...