【问题标题】:Parallel programming array handling in PythonPython中的并行编程数组处理
【发布时间】:2016-02-08 19:30:57
【问题描述】:

我已经看到了很多关于使用 python 的multiprocessing 的问题,但我一直无法完全理解如何在我的代码中使用它。

假设我有一个 NxM 数组。我有一个函数 f 将 (i,j) 处的值与其他每个像素进行比较。因此,本质上,我计算网格上每个点的 NxM 值。

我的机器有四个核心。我设想我会将输入位置分成四个象限,然后将每个象限提供给不同的进程。

所以,从原理上讲,我当前的代码是:

def f(x, array):
    """
    For input location x, do some operation 
    with every other array value. As a simple example,
    this could be the product of array[x] with all other
    array values
    """
    return array[x]*array

if __name__ == '__main__':
    array = some_array
    for x in range(array.size):
        returnval = f(x,array)

`

使用多处理优化此类问题的最佳策略是什么?

【问题讨论】:

  • 您想如何存储答案?在另一个数组中?
  • 如果您的问题是数学问题,您可能需要查看numpy。尽管在 CPython 中被 GIL 绑定到单核性能,但 numpy 代码释放了它,因此您的代码使用线程 + numpy 比使用多处理更有效。
  • @bbayles 是的,它必须是另一个相同大小的数组,NxM。因此,保持订单很重要。
  • @myaut 你能详细说明一下 numpy 会如何帮助我吗?另外,据我了解,线程对 I/O 特别有用,而不是对繁重的计算有用吗?谢谢!
  • @John:检查这个答案:stackoverflow.com/questions/6200437/…

标签: python arrays parallel-processing


【解决方案1】:

multiprocessing 库可以通过其 Pool.map 函数为您完成大部分繁重的工作。

唯一的限制是它将使用一个带有单个参数的函数,即您正在迭代的值。基于this other question,最终实现将是。

from multiprocessing import Pool
from functools import partial

# Make a version of f that only takes x parameter
partial_f = partial(f, array=SOME_ARRAY)

if __name__ == '__main__':
    pool = Pool(processes=5)  # Number of CPUs + 1
    returnval = pool.map(partial_f, range(array.size))

【讨论】:

    【解决方案2】:

    您所描述的策略 ​​- 将数据集发送给多个工作人员,让每个工作人员计算部分数据集的值,并在最后将它们拼接在一起 - 是对这样的算法进行并行计算的经典方法,其中答案不依赖于彼此。这就是MapReduce 所做的。

    也就是说,引入并行性会使程序更难理解,也更难在以后适应或改进。 您所描述的算法以及使用原始 Python 进行大型数值计算都可能是更好的事情要先改变。

    在并行化代码之前,请考虑检查使用 numpy 数组表达您的计算是否可以使其运行得更快,以及您是否可以为您尝试解决的问题找到或开发更有效的算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多