在python上使用多线程来更快地处理图像?

2024-09-29 22:26:12 发布

您现在位置:Python中文网/ 问答频道 /正文

在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: 函数inpos图像image脚本forsize
3条回答

由于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()检查可用的内核数。在

相关问题 更多 >

    热门问题