繁体   English   中英

Python 中的并行/多处理(嵌套)循环并存储结果?

[英]Parallel/multiprocessing (nested) loops in Python and storing the results?

我有两个问题,我认为它们足够相关,可以成为一个问题的一部分。 但如果不是,我可以将它们作为单独的问题提出。 请告诉我。 我也提前道歉,因为我觉得我做错了什么,但我不知道它是什么。

到目前为止,我在 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)]

接下来,我运行一堆循环,一个在另一个里面,然后运行一个 function(这取决于我在循环中使用的所有索引),将结果分配给我在上面创建的一个位置:

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. function 在每次迭代中返回的对象彼此完全独立(例如,我可以在一台计算机上运行循环的每次迭代并稍后收集它们)。 所以我想这个循环将是在并行/多处理中解决的理想候选者。 如果是这样,我该怎么做? 我发现一些提到并行运行嵌套循环,但我不明白它如何适用于我的案例。 完全披露:我从未在 Python 中并行运行任何东西。

  2. 这个列表(引用这个相当不愉快的object[i][j][k][l][m][n][o][p] )你将如何正确保留结果(以你可以找到的方式之后)? 或者你能建议一个更好的方法吗? 如果相关,则 function 返回的对象具有 pandas 数据帧、数字和字符串等属性。

对于您的第一个问题,我建议您在此处查看最佳答案,以了解如何并行化我在下面概述的 for 循环(它回答了问题 2):

如何并行化一个简单的 Python 循环?

第二个问题:

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

如果函数的 output 是可散列的,我将创建一个字典:

#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 

如果 output 不可散列,则保留为列表:

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM