распаковать список созданный картой пула - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть код, который я хотел распараллелить

final_list = []
for module_packages in module_packages_list:
    for module_package in module_packages:
        final_list += parse_jdk_package(module_package)

Он создает список списков -> в основном структура [[items],[items]]

Я хотел распараллелить второй цикл, используя Pool. Я сделал это так:

for module_packages in module_packages_list:
    with Pool(4) as p:
        final_list += p.map(parse_jdk_package, module_packages)

Хотя это действительно стало быстрее, он создает дополнительный список поверх списка списков. Как его распаковать? Я пытался сделать это следующим образом

final_list += zip(*p.map(parse_jdk_package, module_packages))

Но он превратился в [([ вместо обычного результата [[[, который я получаю из map

1 Ответ

0 голосов
/ 05 ноября 2019

Использование itertools.chain:

def compute_pool(n, f, m):
    with Pool(n) as p:
        return p.map(f, m)

final_list = itertools.chain.from_iterable(
        compute_pool(4, parse_jdk_package, module_packages) for module_packages in module_packages_list
    )

Но было бы лучше вычислить все с одним и тем же пулом:

with Pool(4) as p:
    final_list = p.map(
        parse_jdk_package,
        itertools.chain.from_iterable(module_packages_list)
    )
...