并行化嵌套Python for循环

时间:2017-08-18 23:01:37

标签: python-2.7 parallel-processing

哪种类型的并行Python方法适合有效地传播下面显示的CPU绑定工作负载。并行化该部分是否可行?看起来循环迭代之间没有太多紧密耦合,即循环的各部分可以并行处理,只要在最后完成重建invoice_item变量的适当通信即可。我目前正在使用Python2.7,但是如果能够在较新的版本中轻松处理这个问题,那么我会考虑迁移代码库。

我试图通过下面的例子来捕捉计算的精神。我相信它在循环/变量之间具有与我的实际代码相同的连接性。

store

1 个答案:

答案 0 :(得分:1)

您可以采取以下两种方法。什么是明智的还取决于瓶颈在哪里,这是最好的测量而不是猜测。

理想的选择是将所有低级优化留给Numpy。现在你有了原生Python代码和Numpy代码的混合。后者不适合循环。当然,它们可以工作,但是通过在Python中使用循环,可以按照指定的顺序强制执行操作。最好让Numpy操作尽可能多地执行多个元素,即矩阵变换。这有利于性能,不仅仅是因为自动(部分)并行化;甚至单线程也能从CPU中获得更多。强烈推荐阅读以了解有关此内容的更多信息,请From Python to Numpy

如果您确实需要并行化纯Python代码,那么您可以选择多个进程。为此,请参阅multiprocessing模块。将代码重新排列为三个步骤:

  • 为每项工作准备输入
  • 在一个工作池之间划分这些作业并行(fork / map)
  • 收集结果(加入/减少)

你需要在足够的进程之间取得平衡才能使并行化变得有价值,而不是太多以至于它们将过于短暂。然后,启动流程并与流程进行通信的成本将变得非常重要。

一个简单的解决方案是生成(i,j)对的列表,以便有nx*ny个作业。然后创建一个将此对作为输入的函数,并返回(i,j,k,p,meanval)的列表。尝试仅使用函数的输入并返回结果。一切都在当地;没有副作用等。对{(1}}等全局变量的只读访问是可以的,但修改需要采取特殊措施,如文档中所述。将函数和输入列表传递给工作池。完成部分结果生成后,将所有结果合并到myList1

这是一个示例脚本:

store