У меня есть функция, которая принимает два входа, предоставленные комбинациями itertools, и выводит решение. Два входа должны храниться как кортеж, образующий ключ в словаре, а результатом является значение.
Я могу объединить это и получить все результаты в виде списка, который затем я могу вставить в словарь один за другим, но это кажется неэффективным. Есть ли способ получить результаты по завершении каждого задания и напрямую добавить их в словарь?
По сути, у меня есть код ниже:
all_solutions = {}
for start, goal in itertools.combinations(graph, 2):
all_solutions[(start, goal)] = search(graph, start, goal)
Я пытаюсь распараллелить это следующим образом:
all_solutions = {}
manager = multiprocessing.Manager()
graph_pool = manager.dict(graph)
pool = multiprocessing.Pool()
results = pool.starmap(search, zip(itertools.repeat(graph_pool),
itertools.combinations(graph, 2)))
for i, start_goal in enumerate(itertools.combinations(graph, 2)):
start, goal = start_goal[0], start_goal[1]
all_solutions[(start, goal)] = results[i]
Что на самом деле работает, но повторяется дважды, один раз в пуле и один раз для записи в dict (не говоря уже о неуклюжей распаковке кортежа).
for i, (start, goal) in enumerate(itertools.combinations(graph, 2)):
распаковывается непосредственно вstart
иgoal
(круглые скобки не необязательны в этом случае, потому что они нужны, чтобы было ясно, что происходит вложенная распаковка). - person ShadowRanger   schedule 14.02.2018