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

Mai*_*tor 4 python gpu numpy image-processing 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])
Run Code Online (Sandbox Code Playgroud)

这花费了太多时间.如何实现线程来分割加速它的工作?多线程代码的速度有多快?特别是,这是由处理器核心数量定义的吗?

Bjö*_*lex 6

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

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

根据您的任务,您可以通过对单个图像进行分区来并行处理单个图像,也可以并行处理图像列表(后者可以使用a轻松完成pool).如果您想使用前,你可能要存储在一个图像Array,可以共享内存访问,但是你还是要解决的,其中写结果的问题(写入共享内存可以元气大伤性能).另请注意,进程之间的某些类型的通信(队列,管道或模块中某些函数的参数/返回值传递)需要使用Pickle对数据进行序列化.这对数据施加了某些限制,并且可能会产生显着的性能开销(特别是如果您有许多小任务).

为提高此类操作的性能的另一种方法是尝试在写他们用Cython,它有自己的并行支持使用OpenMP -我从来没有使用过,虽然,所以我不知道多少的帮助可以.