map和starmap实现传递附加参数并尽可能并行化
parmap的Python项目详细描述
这个小python模块实现了四个函数:map和 starmap,以及它们的异步版本map_async和starmap_async。
Parmap提供什么?
- 为map和starmap提供易于使用的语法。
- 尽可能透明地并行化。
- 将其他位置参数和关键字参数传递给并行化函数。
- 显示进度条(需要将TQMM作为可选包)
安装:
pip install tqdm # for progress bar support pip install parmap
用法:
下面是一些例子,其中一些未并行化的代码与 参数映射:
简单的并行化示例:
import parmap # You want to do: mylist = [1,2,3] argument1 = 3.14 argument2 = True y = [myfunction(x, argument1, mykeyword=argument2) for x in mylist] # In parallel: y = parmap.map(myfunction, mylist, argument1, mykeyword=argument2)
显示进度条:
需要pip install tqdm
# You want to do: y = [myfunction(x) for x in mylist] # In parallel, with a progress bar y = parmap.map(myfunction, mylist, pm_pbar=True)
传递多个参数:
# You want to do: z = [myfunction(x, y, argument1, argument2, mykey=argument3) for (x,y) in mylist] # In parallel: z = parmap.starmap(myfunction, mylist, argument1, argument2, mykey=argument3) # You want to do: listx = [1, 2, 3, 4, 5, 6] listy = [2, 3, 4, 5, 6, 7] param = 3.14 param2 = 42 listz = [] for (x, y) in zip(listx, listy): listz.append(myfunction(x, y, param1, param2)) # In parallel: listz = parmap.starmap(myfunction, zip(listx, listy), param1, param2)
高级:多个并行任务并行运行
在本例中,task1使用5核,task2使用3核。两个任务都开始 同时计算,我们会在任何任务完成后立即打印一条消息 完成,检索结果。
import parmap def task1(item): return 2*item def task2(item): return 2*item + 1 items1 = range(500000) items2 = range(500) with parmap.map_async(task1, items1, pm_processes=5) as result1: with parmap.map_async(task2, items2, pm_processes=3) as result2: data_task1 = None data_task2 = None task1_working = True task2_working = True while task1_working or task2_working: result1.wait(0.1) if task1_working and result1.ready(): print("Task 1 has finished!") data_task1 = result1.get() task1_working = False result2.wait(0.1) if task2_working and result2.ready(): print("Task 2 has finished!") data_task2 = result2.get() task2_working = False #Further work with data_task1 or data_task2
H2>地图和星图已经存在。为什么要重新发明轮子?
现有功能有一定的可用性限制:
- 内置的python函数map[1] 无法并行化。
- multiprocessing.Pool().starmap[2] 仅在python-3.3及更高版本中可用。
- ^{TT10}$[3] 不允许映射函数有任何附加参数。
- multiprocessing.Pool().starmap允许传递多个参数, 但是为了给映射函数传递一个常量参数 将需要使用 itertools.repeat(your_parameter)[4]
parmap旨在以最简单的方式克服这一限制。
parmap中的其他功能:
- 如果可能,自动创建并行计算池。
- parmap.map(...,..., pm_parallel=False)禁用并行化
- parmap.map(...,..., pm_processes=4)使用4个并行进程
- parmap.map(...,..., pm_pbar=True)显示进度条(需要tqdm)
- parmap.map(...,..., pm_chunksize=3)块大小(请参见 多处理.pool().map)
限制:
parmap.map()和parmap.starmap()(及其异步版本)有自己的 参数(pm_parallel,pm_pbar…)。那些论点从未通过 到底层函数。在下面的示例中,myfun将接收 myargument,但不是pm_parallel。不要编写需要 以pm_开头的关键字参数,因为parmap将来可能需要它们。
parmap.map(myfun, mylist, pm_parallel=True, myargument=False)
此外,在 您编写的函数,因为parmap向后兼容的原因。名单 冲突参数的数目为:parallel,chunksize,pool, processes,callback,error_callback和parmap_progress。
致谢:
此包在this question之后启动, 当我提供这个answer, 采纳J.F.塞巴斯蒂安对他的建议
使用parmap的已知作品
- 戴维德·格洛萨,迈克尔·凯斯登,“进动。旋转黑洞动力学 使用python的二进制文件。“arXiv:1605.01067,2016
- Thibault de Boissiere,Implementation of Deep learning papers,2017年
- wasserstein生成性对抗网络arXiv:1701.07875
- pix2pixarXiv:1611.07004
- 改进的生成性对抗网络训练技术arXiv:1606.03498
- 彩色图像着色arXiv:1603.08511
- 图像内容更改的深度特征插值arXiv:1611.05507
- 信息根arXiv:1606.03657
- 澳大利亚地球科学,SIFRA, a System for Infrastructure Facility Resilience Analysis,2017年
- Andréf.Rendeiro,Christian Schmidl,Jonathan C.Strefford,Renata Walewska,Zadie Davis,Matthias Farlik,David Oscier,Christoph Bock“慢性淋巴细胞性白血病患者染色质可及性地图”FY亚型特异表观基因组特征和转录调控网络“NAT。公社7:11938 doi:10.1038/ncomm11938(2016年)。Paper,Code
参考文献
[1] | http://docs.python.org/dev/library/functions.html#map |
[2] | http://docs.python.org/dev/library/multiprocessing.html#multiprocessing.pool.Pool.starmap |
[3] | http://docs.python.org/dev/library/multiprocessing.html#multiprocessing.pool.Pool.map |
[4] | http://docs.python.org/2/library/itertools.html#itertools.repeat |