我已经创建了一个图像处理python函数。
我的系统有4个核心+4个线程。
我想使用多处理来加速我的功能,但是无论何时使用多处理程序包,我的功能都不会更快,而且速度慢一分钟。 任何想法?第一次使用多处理包。
主要功能:
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分钟
答案 0 :(得分:1)
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))
但是由于你有一个输入,你只需要运行一次你的功能,所以没有区别。希望这会有所帮助。
答案 1 :(得分:0)
您在子流程中使用相同的参数执行相同的功能 - 这必然会变慢,因为至少会有创建新流程的系统开销,然后是Python自己的开销。它创建了一个全新的解释器,堆栈,GIL ......这需要时间。
在POSIX系统上,这种开销会更快,因为它可以使用分叉和写时复制内存,但在Windows上,这基本上就像从命令行调用python -c "from your_script import myfun; myfun('C:/Users/username/Desktop/in.tif', 'C:/Users/username/Desktop/out.tif')"
并且需要相当多的时间时间。
只有当您具有可以从您的功能并行化的相当大的计算要求时,您才会注意到多处理的好处。查看this answer中的简单基准。