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

标签 python image-processing numpy gpu python-imaging-library

在 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])

这花费了太多时间。如何实现线程来拆分工作以加快速度?多线程代码能多快?具体来说,这是由处理器内核的数量来定义的吗?

最佳答案

由于 Global Interpreter Lock,您无法使用线程加速它. Python 解释器的某些内部状态受该锁保护,从而防止需要修改该状态的不同线程同时运行。

可以通过使用 multiprocessing 生成实际进程来加速它.每个进程都会在自己的解释器中运行,从而绕过了线程的限制。通过多处理,您可以使用共享内存,或者为每个进程提供自己的数据副本/分区。

根据您的任务,您可以通过分割来并行处理单个图像,也可以并行处理图像列表(后者可以使用 pool 轻松完成)。如果您想使用前者,您可能希望将图像存储在 Array 中。可以作为共享内存访问,但您仍然必须解决将结果写入何处的问题(写入共享内存会严重损害性能)。另请注意,进程之间的某些类型的通信(队列、管道或模块中某些函数的参数/返回值传递)需要使用 Pickle 序列化数据。 .这对数据施加了一定的限制,并且可能会产生显着的性能开销(尤其是当您有许多小任务时)。

另一种提高此类操作性能的方法是尝试将它们写在 Cython 中, 它有自己的 support for parallelization使用 OpenMP - 虽然我从未使用过它,所以我不知道它能提供多少帮助。

关于python - 使用多线程在 python 上更快地处理图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8802916/

相关文章:

python - 3 个 cython/python 函数调用之间的差异

python - Pandas:使用 np.where() 删除值小于今天的行?

python - 在 python 中传递命令行 arg 的实现不起作用

python - 使用代码将任何 2D 图像变成可 3D 打印的雕塑

python - 无法将 Pandas 中的 float 限制为小数点后两位

python - 在 colaboratory 中从驱动器加载 xlsx 文件

opencv - OpenCV在图像中查找特定坐标

matlab - K-means 在某些图像区域比高斯混合模型更准确

python - matplotlib 中的球面坐标图

python - 在 Python 中查找最接近的值并返回数组的索引