map和starmap实现传递附加参数并尽可能并行化

parmap的Python项目详细描述


https://travis-ci.org/zeehio/parmap.svg?branch=masterDocumentation Statushttps://codecov.io/github/zeehio/parmap/coverage.svg?branch=masterCode Climate

这个小python模块实现了四个函数:mapstarmap,以及它们的异步版本map_asyncstarmap_async

Parmap提供什么?

  • mapstarmap提供易于使用的语法。
  • 尽可能透明地并行化。
  • 将其他位置参数和关键字参数传递给并行化函数。
  • 显示进度条(需要将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)
  • ^ {Tt17}$$使用现有的 池,在这种情况下,parmap不会关闭池。
  • parmap.map(...,..., pm_chunksize=3)块大小(请参见 多处理.pool().map)

限制:

parmap.map()parmap.starmap()(及其异步版本)有自己的 参数(pm_parallelpm_pbar…)。那些论点从未通过 到底层函数。在下面的示例中,myfun将接收 myargument,但不是pm_parallel。不要编写需要 以pm_开头的关键字参数,因为parmap将来可能需要它们。

parmap.map(myfun, mylist, pm_parallel=True, myargument=False)

此外,在 您编写的函数,因为parmap向后兼容的原因。名单 冲突参数的数目为:parallelchunksizepoolprocessescallbackerror_callbackparmap_progress

致谢:

此包在this question之后启动, 当我提供这个answer, 采纳J.F.塞巴斯蒂安对他的建议

使用parmap的已知作品

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在EclipseIndigo上安装新的Glassfish服务器   java打印组织的最短方法是什么。w3c。多姆。文件发送到stdout?   安卓 java。lang.NullPointerException:尝试在oncreate方法中的null对象引用上调用virtual方法   linux java,我的线程无一例外地终止了,为什么?   JSON和Lombok构造函数的java问题Jackson反序列化   Spring引导升级后,java无法实例化自定义库的数据源   输入Kotlin中Java Scanner的等价物是什么?   列表vs数组作为java中递归的参数   创建名为“FilterService”的bean时发生java错误:通过字段“filterDAO”表示的未满足的依赖关系   如何在Java(基本上是Android)中将指纹图像的字节数组转换为iso 19794_2?   java如何使用基本适配器单击每个位置   java如何更新数据库显示消息“您的数据库已更新,没有任何错误,但实际上我的数据库未更新”   不同比例的安卓屏幕设备的java程序   java Android For循环,全局静态列表与本地列表