2014-09-13 92 views
0

我有一个for循环,它使用一些二进制条件并最终相应地写入一个文件。我遇到的问题是,许多文件的条件是正确的(有时需要写入大约1000个文件)。所以写它们需要很长时间(大约10分钟)。我知道我可以以某种方式使用Python的multiprocessing并利用一些内核。对for循环使用多处理,Python

这是可用的代码,但只使用一个核心。

for i,n in enumerate(halo_param.strip()): 
    mask = var1['halo_id'] == n 
    newtbdata = tbdata1[mask] 
    hdu = pyfits.BinTableHDU(newtbdata) 
    hdu.writeto(('/home/Documments/file_{0}.fits').format(i)) 

我碰到它可以使用Poolmultiprocessing来完成。

if __name__ == '__main__': pool = Pool(processes=4)

我想知道如何做到这一点,利用我的核心ATLEAST 4。

回答

1

重构for循环体作为函数,并使用该函数使用Pool.map

def work(arg): 
    i, n = arg 
    mask = var1['halo_id'] == n 
    newtbdata = tbdata1[mask] 
    hdu = pyfits.BinTableHDU(newtbdata) 
    hdu.writeto(('/home/Documments/file_{0}.fits').format(i)) 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    pool.map(work, enumerate(halo_param.strip())) 
    pool.close() 
    pool.join() 
+0

因此,当我们调用'pool.map'时,通过说'i,n = arg'函数使arg成为'enumerate(halo_param.strip())'。但它是如何循环?我没有看到任何循环,但它似乎工作! – ThePredator 2014-09-13 19:50:48

+1

@ThePredator,'multiprocessing.Pool.map'就像一个内建函数['map'](https://docs.python.org/2/library/functions.html#map)。 'map'对序列中的每个项目(或任何可迭代的,第二个参数)应用给定的函数。如果您想了解更多关于“地图”功能的信息,请点击链接。 – falsetru 2014-09-13 19:53:20