Параллельные / многопроцессорные (вложенные) циклы в Python и сохранение результатов? - PullRequest
0 голосов
/ 10 июля 2020

У меня есть два вопроса, которые, я думаю, достаточно связаны, чтобы быть частью одного вопроса. Но если это не так, я могу задать их как отдельные вопросы. Пожалуйста, дайте мне знать. Я также заранее извиняюсь, потому что у меня сложилось впечатление, что я делаю что-то очень не так, но я не знаю, что это такое.

Пока что я запускаю следующий код в Python (используя записные книжки Jupyter , если это имеет значение):

Сначала я инициализирую очень длинный (многоуровневый?) список:

object = [[[[[[[[None for i in range(2)]  
               for j in range(2)] 
              for k in range(2)] 
             for l in range (2)] 
            for m in range (2)] 
           for n in range (2)]
          for o in range (2)]
         for p in range (2)]

Затем я запускаю кучу циклов, один внутри другого, и запустите одну функцию (которая зависит от всех индексов, которые я использую в l oop), присвоив результат одной из позиций, которые я создал выше:

for i in range(2):
    for j in range(2):
        for k in range(2):
            for l in range(2):
                for m in range(2):
                    for n in range(2):
                        for o in range(2):
                            for p in range(2):
                                object[i][j][k][l][m][n][o][p] = function(i,j,k,l,m,n,o,p) 

Вот два связанные вопросы:

  1. Объекты, которые функция возвращает на каждой итерации, полностью независимы друг от друга (я мог запускать каждую итерацию l oop на одном компьютере и собирать их позже, например). Итак, я полагаю, что этот l oop был бы идеальным кандидатом для решения в параллельной / многопроцессорной обработке. Если да, то как мне это сделать? Я нашел несколько упоминаний о параллельном запуске вложенных циклов, но не мог понять, как это применимо в моем случае. Полное раскрытие: я никогда не запускал ничего параллельно в Python.

  2. Является ли этот список (отсылка к этому довольно неприятному object[i][j][k][l][m][n][o][p]), как вы бы правильно сохранили результаты (в некотором смысле что найдешь позже)? Или вы могли бы предложить лучший способ? Если это актуально, объекты, возвращаемые функцией, имеют такие свойства, как pandas фреймы данных, числа и строки.

1 Ответ

0 голосов
/ 10 июля 2020

Для вашего первого вопроса я предлагаю вам посмотреть здесь на верхние ответы, чтобы увидеть, как распараллелить for l oop, который я описываю ниже (который отвечает на вопрос 2): простой Python l oop?

Второй вопрос:

#dummy function for illustrative purposes
def function(a,b,c,d,e,f,g,h):
  return a+b+c+d+e+f+g+h

Если бы вывод функций был хешируемым, я бы создал словарь:

#This is your 'objects'
O={}

for y in range(2**8):
    #this generates all the permutations you were after I believe
    s=format(y, '#010b')[2:]
    #print(s) #uncomment to see what it does
    #This is slightly messy, in that you have to split up your integer into its components, but I've seen worse.
    O[y]=function(int(s[0]),int(s[1]),int(s[2]),int(s[3]),int(s[4]),int(s[5]),int(s[6]),int(s[7]))

#Now, if you wanted to print the output of f(1,1,1,1,1,1,1,1):
g='11111111'
print(O[int(g,2)]) #uncomment to see what it does 

#print(O) #uncomment to see what it does 

Если вывод не может быть хеширован, просто оставьте список:

O=[] 

for y in range(2**8):
    #this generates all the permutations you were after I believe
    s=format(y, '#010b')[2:]
    #print(s) #uncomment to see what it does
    #This is slightly messy, in that you have to split up your integer into its components, but I've seen worse.
    O.append(function(int(s[0]),int(s[1]),int(s[2]),int(s[3]),int(s[4]),int(s[5]),int(s[6]),int(s[7])))

#Now, if you wanted to print the output of f(1,1,1,1,1,1,1,1):
g='11111111'
#print(O[int(g,2)]) #uncomment to see what it does 

#print(O) #uncomment to see what it does 
...