Чтобы распараллелить каждый вызов, вам просто нужно получить список для каждого аргумента. Вы можете использовать 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)
Теперь мы просто отобразим нашу функцию на эти два списка, чтобы распараллелить вложенные циклы:
def f(z,a):
return z*a
view.map(f, allzeniths, allazimuths)
И ничего особенного в том, что их всего два - этот метод должен распространяться на произвольное количество вложенных циклов.