在Python+Python图像库脚本中,有一个名为processPixel(Image,pos)的函数,它计算图像函数中的数学索引及其位置。使用简单的for循环为每个像素计算该索引:
for x in range(image.size[0)):
for y in range(image.size[1)):
myIndex[x,y] = processPixel(image,[x,y])
这太花时间了。如何实现线程化来分割加速itup的工作呢?多线程代码能有多快?具体来说,这是由处理器核的数量定义的吗?在
Tags:
由于Global Interpreter Lock,无法使用线程加速它。Python解释器的某些内部状态受到该锁的保护,从而防止需要修改该状态的不同线程并发运行。在
您可以通过使用^{} 生成实际进程来加速它。每个进程将在自己的解释器中运行,从而避免了线程的限制。对于多处理,您可以使用共享内存,也可以为每个进程提供自己的数据副本/分区。在
根据您的任务,您可以通过对单个图像进行分区来并行处理单个图像,也可以并行处理一系列图像(后者可以使用^{} 轻松完成)。如果您想使用前者,您可能希望将图像存储在可以作为共享内存访问的^{} 中,但是您仍然必须解决将结果写入何处的问题(写入共享内存会严重影响性能)。还请注意,进程之间的某些类型的通信(队列、管道或传递模块中某个函数的参数/返回值)需要使用Pickle对数据进行序列化。这对数据施加了一定的限制,并且可能会产生显著的性能开销(特别是当您有许多小任务时)。在
另一种提高此类操作性能的方法是尝试使用OpenMP在Cython中编写这些操作,它有自己的support for parallelization使用OpenMP—但是我从未使用过,所以我不知道它能有多大帮助。在
下面是一个库的列表,您需要探索这些库来进行有效的图像处理:
OpenCV-是一个用于实时计算机视觉和图像处理的编程函数库,其中包含Python绑定。在
PyOpenCL允许您从Python访问gpu和其他大规模并行计算设备。在
PyCUDA是{a2}的姊妹项目
NumPy and SciPy是进行科学计算的基本软件包,这些软件包可能有助于上述软件包进行有效的图像和数组处理。在
另外请注意,对于进行图像处理,一些人建议的多处理库不能帮助您有效地处理图像处理,因此您应该避免使用操作系统线程来完成此操作。如果出于某种原因您确实需要粗粒度并行,那么可以使用python library for MPI,但您可能希望坚持使用GPU-based libraries。在
看看Doug Hellmans tutorial关于多处理。正如Björn所指出的,在并行处理方面有很多问题需要掌握,但是它确实值得努力。在
提示:您可以使用multiprocessing.cpu_count()检查可用的内核数。在
相关问题 更多 >
编程相关推荐