【问题标题】:Converting nested loop Python code to use multiprocessing pool将嵌套循环 Python 代码转换为使用多处理池
【发布时间】:2020-08-25 19:08:17
【问题描述】:

我有一些具有以下结构的代码:一个接受嵌套参数范围的函数。对于 MVCE 目的,考虑以下内容就足够了

def func(x, y):
    return x*x, x+(5*y)

results = []
for a in range(3):
    for b in range(2,5):
        temp_results = func(a,b)
        results.append(temp_results)

sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
print(sorted_results)

我正在尝试使用多处理池来运行 func(a, b) 部分。我想尽可能地保持上面的结构。

这是我目前所看到的基于多处理池示例的内容。地图参数不起作用,因为他们期望那里有块大小。另外,如何将池结果收集到稍后排序的列表中?有没有办法以与上述单线程案例非常相似的方式来做到这一点?

a_params = []
b_params = []
for a in range(3):
    for b in range(2,5):
        a_params.append(a)
        b_params.append(b)

from multiprocessing import Pool

def pool_handler():
    p = Pool(2)
    p.map(func, a_params, b_params)

if __name__ == '__main__':
    pool_handler()

【问题讨论】:

    标签: python-3.x nested-loops python-multiprocessing


    【解决方案1】:

    map 用于具有单个参数的函数。如果要传递多个参数,请使用starmap(或重写func 以获取参数元组并将参数元组传递给map)。

    您无需执行任何额外操作即可将结果放入列表中。 map/starmap 自动将结果累加到一个列表中。

    所以,总的来说,这是可行的:

    import multiprocessing as mp
    
    def func(x, y):
        print(x*x, x+(5*y))
        return x*x, x+(5*y)
    
    def main():
        with mp.Pool(2) as pool:
            results = pool.starmap(func,
                                   [(a, b) for a in range(3)
                                           for b in range(2, 5)])
        sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
        print(sorted_results)
    
    if __name__ == '__main__':
        main()
        
    

    并显示:

    0 10
    0 15
    0 20
    1 11
    1 16
    1 21
    4 12
    4 17
    4 22
    [(4, 22), (1, 21), (0, 20), (4, 17), (1, 16), (0, 15), (4, 12), (1, 11), (0, 10)]
    

    【讨论】:

      【解决方案2】:

      您只需要保存结果并最终订购它们。

      import multiprocessing as mp
      
      
      def func(vals):
          x, y = vals
          return x*x, x+(5*y)
      
      
      def main():
          input_data = []
          for a in range(3):
              for b in range(2, 5):
                  input_data.append([a, b])
      
          n_threads = 4
          pool = mp.Pool
          with pool(n_threads) as p:
              results = p.map(func, input_data)
      
          sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
          print(sorted_results)
      
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-01
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多