ฉันมีฟังก์ชันที่ยอมรับอินพุตสองตัวที่มาจากการรวมกันของ itertools และเอาต์พุตโซลูชัน อินพุตทั้งสองควรถูกจัดเก็บเป็นสิ่งทูเปิลที่สร้างคีย์ใน dict ในขณะที่ผลลัพธ์คือค่า
ฉันสามารถรวมสิ่งนี้และรับผลลัพธ์ทั้งหมดเป็นรายการ ซึ่งฉันสามารถแทรกลงในพจนานุกรมได้ทีละรายการ แต่ดูเหมือนว่าจะไม่มีประสิทธิภาพ มีวิธีรับผลลัพธ์เมื่อแต่ละงานเสร็จสิ้นและเพิ่มลงใน dict โดยตรงหรือไม่
โดยพื้นฐานแล้วฉันมีรหัสด้านล่าง:
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 (ไม่ต้องพูดถึงการแกะ tuple ที่เกะกะ)
for i, (start, goal) in enumerate(itertools.combinations(graph, 2)):
แตกไฟล์ลงในstart
และgoal
โดยตรง (วงเล็บ ไม่ใช่ เป็นทางเลือกในกรณีนี้ เพราะคุณต้องการให้มันชัดเจนว่าเป็นการแกะกล่องแบบซ้อนที่เกิดขึ้น) - person ShadowRanger   schedule 14.02.2018