要并行化每个调用,您只需要获取每个参数的列表。您可以使用itertools.product
+ zip
得到这个:
allzeniths, allazimuths = zip(*itertools.product(zeniths, azimuths))
然后你可以使用地图:
amr = dview.map(f, allzeniths, allazimuths)
为了更深入地了解这些步骤,下面是一个示例:
zeniths = range(1,4)
azimuths = range(6,8)
product = list(itertools.product(zeniths, azimuths))
# [(1, 6), (1, 7), (2, 6), (2, 7), (3, 6), (3, 7)]
所以我们有一个“成对列表”,但我们真正想要的是每个参数都有一个列表,即“成对列表”。这正是稍微有点奇怪的地方zip(*product)
语法让我们:
allzeniths, allazimuths = zip(*itertools.product(zeniths, azimuths))
print allzeniths
# (1, 1, 2, 2, 3, 3)
print allazimuths
# (6, 7, 6, 7, 6, 7)
现在我们只需将函数映射到这两个列表上,以并行化嵌套 for 循环:
def f(z,a):
return z*a
view.map(f, allzeniths, allazimuths)
只有两个并没有什么特别之处 - 这个方法应该扩展到任意数量的嵌套循环。