2011-10-28 51 views
1
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.) 

OtherList和其他数组中元素的个数可以单独计算。 但是,由于程序是时间相关的,因此我们无法继续进行下一步工作,直到处理完每个“数量”元素为止。多处理会是这个操作的一个很好的解决方案吗?

多处理会是这个操作的一个很好的解决方案吗? 我应该最大限度地加快这个过程。 如果更好,请提供代码。

+0

您是否有工作代码太慢?你有分析过吗? –

+1

'len(Number)'将失败,因为你不能取一个数字的长度。 'array([None] * Number)'似乎是创建数组的一个缓慢的方式,因为它首先创建一个相等大小的Python列表。也许你应该用'空'或'零'来创建你的数组。 –

+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)

不知道有什么具体的计算或数组的大小我这里还有没有特定的顺序一般准则:

  • 代码的措施性能。找到热点。您的代码可能会比所有计算都加载输入数据更长。设置你的目标,界定什么折衷是可以接受的
  • 检查与自动化测试,你得到预期的结果
  • 检查您是否可以使用优化库来解决问题
  • 确保算法有足够的时间复杂度。纯Python中的O(n)算法可能比C中的O(n**2)算法更快n
  • 使用分片和向量化(自动循环)计算来替代纯Python解决方案中的显式循环。
  • 重写需要使用weave,f2py,cython或类似优化的位置。提供类型信息。探索编译器选项。决定加速值是否值得保留C扩展。
  • 最小化分配和数据复制。让它缓存友好。
  • 探讨多个线程在您的情况下是否有用,例如cython.parallel.prange()。释放GIL。
  • 与多处理方法比较。上面的链接包含一个示例,如何并行计算不同数组的片段。
  • 迭代
+1

很好的建议!实际上,你可以在多处理中很好地使用numpy数组。我一直这样做。你只需要意识到最简单的方法就是不使用共享内存。 'multiprocessing'可以让你腌制它们并将它们发送回类似于任何其他python对象。显然,这有很高的开销,并且会复制每个“块”,所以技巧(反直觉地)在相对较大的块中工作。这取决于问题,但在某些情况下,在某些情况下,可以使用相当直接的'multiprocessing.pool' +'numpy'方法获得非常好的加速。 –

+0

所有这些都已经说过了,我同意,'多处理'可能不适合OP的问题,而且他们最好以其他方式进行优化。 –

+0

谢谢!我宁愿花时间优化我的代码。 – user989746

0

既然你有一个while True条款那里我会假设你会遇到很多,如果重复这样的潜在收益最终会超过从多池产卵放缓。我还会假设你的机器上有多个逻辑核心,原因很明显。那么问题就出在串行输入和反序列化结果的成本是否被增益所抵消。

根据我的经验,知道是否有什么可以获得的最佳方法是尝试一下。我会建议:

  • 您可以在开始时传递任何常量输入。因此,如果Array_1, Array_2, and Array_3中的任何一个都不会更改,则在致电Process()时将其作为args传递。通过这种方式,您可以减少需要通过IPC选取和传递的数据量(这是multiprocessing的作用)
  • 您可以使用工作队列,并在任务可用时立即添加它。这样,您可以确保在任务完成一个过程时总会有更多工作等待。
相关问题