在 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/