在多处理计算中,MAP()模块和IMAP()之间的差异



我有一个带有多处理的代码:

q = range(len(aaa))
w = range(len(aab))
e = range(len(aba))
paramlist = list(itertools.product(q,w,e))     
def f(combinations):
     q = combinations[0]
     w = combinations[1]
     e = combinations[2]    
# the rest of the function
if __name__ == '__main__':
     pool = mul.Pool(4)
     res_p = pool.map(f, paramlist)
     for _ in tqdm.tqdm(res_p, total=len(paramlist)):
           pass
     pool.close()
     pool.join()

其中'aaa,aab,aba'是具有三重值的列表:

aaa = [[1,2,3], [3,5,1], ...], etc.

我想使用imap()能够使用模块tqdm()遵循计算进度。但是,为什么map()正确地向我展示了list(res_p)列表的长度,但是当我更改为imap()时,列表为空?您可以使用map()模块跟踪进度吗?

tqdmmap不起作用,因为 map正在阻止;它等待所有结果,然后将它们返回为list。到执行循环时,唯一要取得的进展是该循环中发生的事情 - 并行阶段已经完成。

imap不会阻止,因为它仅返回迭代器,即您可以要求下一个结果的东西,以及下一个结果,以及下一个结果。只有当您这样做时,通过循环循环,下一个结果是一个接一个的。它作为迭代器的结果意味着一旦消耗了所有结果(循环的末端),它就空了。因此,没有什么可放入list中的。例如,如果要保留结果,则可以在循环中附加每个代码,也可以将代码更改为:

res_p = list(tqdm.tqdm(pool.imap(f, paramlist), total=len(paramlist)))
for res in res_p:
    ... # Do stuff

相关内容

  • 没有找到相关文章

最新更新