Python脚本在使用多处理后很慢



我创建了一个图像处理Python函数。

我的系统有 4 个内核 + 4 个线程。

我想使用多处理来加速我的函数,但是任何时候使用多处理包我的函数都不快,而且慢了 1 分钟。 知道为什么第一次使用多处理包。

主要功能:

if __name__ == '__main__':
in_path="C:/Users/username/Desktop/in.tif"
out_path="C:/Users/username/Desktop/out.tif"
myfun(in_path, out_path)

时间=3.4分钟

带多处理图:

if __name__ == '__main__':
p = Pool(processes=4)
in_path="C:/Users/username/Desktop/in.tif"
out_path="C:/Users/username/Desktop/out.tif"
result = p.map(myfun(in_path,out_path))

时间 = 4.4 分钟

if __name__ == '__main__':
pool = multiprocessing.Pool(4)
in_path="C:/Users/username/Desktop/in.tif"
out_path="C:/Users/username/Desktop/out.tif"
pool.apply_async(myfun, args=(in_path,out_path,))
pool.close()
pool.join()

时间 = 4.5 分钟

multiprocessing.Pool.map()

不会自动使函数并行运行。因此,这样做Pool.map(my_function(single_input))不会使其运行得更快。事实上,它可能会使它变慢。

map()的目的是允许您在有多个输入多次并行运行相同的函数。

如果您有:

in_paths = ['C:/Users/in1.tif', 'C:/Users/in2.tif', ... ]
out_paths = ['C:/Users/out1.tif', 'C:/Users/out2.tif', ... ]

然后,您可以使用Pool.map()来加速程序,例如:

p = Pool(4)
results = p.map(my_function, zip(in_paths, out_paths))

但是由于您只有一个输入,因此您只需要运行一次函数,因此没有区别。希望这有帮助。

你在子进程中使用相同的参数执行相同的函数 - 这肯定会更慢,因为至少有一个创建新进程的系统开销,然后是 Python 自己的开销。它创建了一个全新的解释器,堆栈,GIL...这需要时间。

在 POSIX 系统上,这种开销要快一些,因为它可以使用分叉和写入时复制内存,但在 Windows 上,这基本上就像您从命令行调用python -c "from your_script import myfun; myfun('C:/Users/username/Desktop/in.tif', 'C:/Users/username/Desktop/out.tif')"一样,这需要相当长的时间。

只有当你有相当大的计算需求,可以从你的函数并行化时,你才会注意到多处理的好处。检查此答案中的简单基准。

相关内容

  • 没有找到相关文章

最新更新