多处理是否可以成为此操作的良好解决方案?

时间:2011-10-28 18:54:13

标签: python numpy multiprocessing

while True:

    Number = len(SomeList)

    OtherList = array([None]*Number)

    for i in xrange(Number):
        OtherList[i] = (Numpy Array Calculation only using i_th element of arrays, Array_1, Array_2, and Array_3.)

'Other'可以单独计算OtherList和其他数组中的元素数。 但是,由于该程序是时间相关的,我们无法继续进一步的工作,直到每个“数量”数量的元素被处理。

多处理是否可以成为此操作的良好解决方案? 我应该最大限度地加快这个过程。 如果更好,请建议代码。

2 个答案:

答案 0 :(得分:4)

It is possible to use numpy arrays with multiprocessing但你不应该这样做。

阅读A beginners guide to using Python for performance computing及其Cython version: Speeding up Python (NumPy, Cython, and Weave)

在不知道阵列的具体计算或大小的情况下,这里的通用指南没有特别的顺序:

  • 衡量代码的效果。寻找热点。您的代码可能会比所有计算加载更长的输入数据。设定目标,定义可接受的权衡取舍
  • 使用自动化测试检查您是否获得了预期结果
  • 检查您是否可以使用优化库来解决问题
  • 确保算法具有足够的时间复杂度。对于大型O(n)
  • ,纯Python中的O(n**2)算法比C中的n算法更快
  • 使用切片和矢量化(自动循环)计算来替换仅限Python的解决方案中的显式循环。
  • 使用weave,f2py,cython或类似方法重写需要优化的地方。提供类型信息。探索编译选项。决定加速是否值得保留C扩展。
  • 最小化分配和数据复制。使其缓存友好。
  • 探索多个线程在您的情况下是否有用,例如cython.parallel.prange()。发布GIL。
  • 与多处理方法比较。上面的链接包含一个如何并行计算不同数组切片的示例。
  • 迭代

答案 1 :(得分:0)

由于你有一个while True子句,我假设你会在迭代时运行很多,所以潜在的收益最终将超过多处理池产生的减速。我还假设您的计算机上有多个逻辑核心,原因很明显。然后问题就变成了序列化输入和反序列化结果的成本是否被增益抵消了。

根据我的经验,最好的方法是知道是否有任何可以获得的东西是尝试一下。我建议:

  • 您在开始时传递任何常量输入。因此,如果Array_1, Array_2, and Array_3中的任何一个永远不会更改,请在调用args时将其作为Process()传递。这样就减少了需要通过IPC选择和传递的数据量(这是multiprocessing所做的)
  • 您可以使用工作队列,并在任务可用时立即添加它们。这样,您可以确保在完成任务的过程中总是有更多工作等待。