itertools.combinations pool()地图中的进度,结果在列表中传递

时间:2015-05-29 18:12:05

标签: python multiprocessing

我运行这样的多重处理脚本:

def intersterer(i):
    somestuff
    return x

if __name__ == '__main__':
    pool = Pool() 
    list = pool.map(intersterer, itertools.combinations(xrange(great_number), 2))  

我想知道如何看到工作的进展。我环顾一个共享的柜台,但它丑陋,似乎没有说实话。 (也许是错误的代码) 有人可以用一种伟大的pythonic方式帮助我吗?

编辑: 就像我的例子一样,我想将所有结果存储在一个列表中,回答问题:Show the progress of a Python multiprocessing pool map call?对此没有帮助。 THKS

EDIT2:

这是解决方法。问每个帮助者!

def intersterer(i):
    somestuff
    return x

numtot = binomial(number,2)
pool = Pool()   
list=[]
tpsb=time.time()
for i in pool.imap_unordered(intersterer, itertools.combinations(xrange(number),2)):
    list.append(i); print "{:3.2f}%, approximatly {:3.2f} seconds left       \r".format(100.*len(list)/numtot,  (time.time()-tpsb)*100./(100.*len(list)/numtot)-(time.time()-tpsb)),

1 个答案:

答案 0 :(得分:2)

使用imap_unordered代替map

>>> from pathos.multiprocessing import Pool
>>> pool = Pool() 
>>> import itertools
>>> 
>>> def interstellar(i):
...   return sum(i)**2
... 
>>> result = []
>>> for i in pool.imap_unordered(interstellar, itertools.combinations(xrange(10),2)):
...   result.append(i); print "{:3.2f}%".format(100.*len(result)/45)
... 
2.22%
4.44%
6.67%
8.89%
11.11%
13.33%
15.56%
17.78%
20.00%
22.22%
24.44%
26.67%
28.89%
31.11%
33.33%
35.56%
37.78%
40.00%
42.22%
44.44%
46.67%
48.89%
51.11%
53.33%
55.56%
57.78%
60.00%
62.22%
64.44%
66.67%
68.89%
71.11%
73.33%
75.56%
77.78%
80.00%
82.22%
84.44%
86.67%
88.89%
91.11%
93.33%
95.56%
97.78%
100.00%
>>> result
[1, 4, 9, 16, 25, 36, 49, 64, 81, 9, 16, 25, 36, 49, 64, 81, 100, 25, 36, 49, 64, 81, 100, 121, 49, 64, 81, 100, 121, 144, 81, 100, 121, 144, 169, 121, 144, 169, 196, 169, 196, 225, 225, 256, 289]

我很懒,并且使用pathos.multiprocessing因此我可以使用解释器...但如果从文件和multiprocessing完成,这也适用于标准__main__。在此解决方案中,您必须知道将有45组合,否则您无法获得不知道最终长度的百分比。

由于您不关心订单而只关心速度,我使用了imap_unordered。如果您关心订单,请使用imap

编辑:啊哈......这是一个重复的问题。