我创建了一个图像处理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')"
一样,这需要相当长的时间。
只有当你有相当大的计算需求,可以从你的函数并行化时,你才会注意到多处理的好处。检查此答案中的简单基准。