Обычно вам нужно беспокоиться только о распараллеливании внутреннего цикла вложенного цикла. Если предположить, что каждый вызов function
достаточно тяжелый, чтобы его можно было выполнять как задачу, то размещения 100 из них одновременно в пуле должно быть более чем достаточно.
Итак, как вы распараллеливаете этот внутренний цикл?
Просто включите его в функцию:
def wrapper(a, c, d, i, j):
b = np.array([i*0.001,j*0.001]).reshape((2,1))
return function(a,b,c,d)
А сейчас:
for i in range(1,101):
pfunc = partial(function, a, c, d, i)
ABCDs = pool.map(pfunc, range(1, 101))
Или вместо создания частичного вы можете просто определить функцию-оболочку внутри цикла i
:
for i in range(1,101):
def wrapper(j):
b = np.array([i*0.001,j*0.001]).reshape((2,1))
return function(a,b,c,d)
ABCDs = pool.map(wrapper, range(1, 101))
Если вы столкнетесь с проблемами при передаче переменных замыкания по очереди пула, это легко; вам на самом деле не нужно захватывать переменные, только значения, поэтому:
for i in range(1,101):
def wrapper(j, *, a=a, c=c, d=d, i=i):
b = np.array([i*0.001,j*0.001]).reshape((2,1))
return function(a,b,c,d)
ABCDs = pool.map(wrapper, range(1, 101))
Если окажется, что одного j
недостаточно для параллелизма, вы можете легко заменить его на (i, j)
:
def wrapper(i, j, *, a=a, b=b, c=c, d=d):
b = np.array([i*0.001,j*0.001]).reshape((2,1))
return function(a,b,c,d)
for i in range(1,101):
ABCDs = pool.map(wrapper, itertools.product(range(1, 101), range(1, 101)))
То, что ABCDs
будет итерируемым из A, B, C, D
значений, так что, скорее всего, все, что вы хотели сделать с A, B, C, D
, зависит только от:
for A, B, C, D in ABCDs:
# whatever