在python中使用带有多个参数列表的并发映射

时间:2015-04-02 18:57:03

标签: python

我尝试使用scoops map调用来并行化我当前的代码。 我知道如何将它应用于基本功能。 我的问题是我想将这个地图调用应用于一个函数,该函数对于某些参数具有一系列值。

我目前的代码如下:

paramA = True
paramB = 500
paramC = [1,2,3,4,5]
paramD = [0,2,4,6,8]

resultsA = []
resultsB = []

for x in paramC:
    for y in paramD:
        resultA, resultB = doFoo(a=paramA, b=paramB, c=x, d=y)
        resultsA.append(resultA)
        resultsB.append(resultB)

doFoo()是一项CPU密集型任务,我想首先将其并行化为多个内核甚至多个主机。 我最终想要的是这样的:

from scoop import futures

paramA = True
paramB = 500
paramC = [1,2,3,4,5]
paramD = [0,2,4,6,8]

resultsA, resultsB = futures.map(doFoo, (paramA, paramB, paramC, paramD))

这可能吗?实现这个目标的pythonic方法是什么?

非常感谢你!

祝你好运, 罗宾

1 个答案:

答案 0 :(得分:0)

执行此操作的最pythonic方法是使用starmap而不是map。不幸的是,它看起来并不像scoop实现starmap,所以你可以用一个带有一个参数元组的函数来包装你的doFoo函数,解压缩它们,然后将它们传递给doFoo。

def doFooStar(params):
    return doFoo(*params)

param_list = ((paramA, paramB, x, y) for x in paramC for y in paramD)

results = futures.map(doFooStar, param_list)
resultsA, resultsB = zip(*results)