我已经创建了一个图像处理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分钟
在子进程中使用相同的参数执行相同的函数-这肯定会比较慢,因为至少创建新进程会有系统开销,然后是Python自己的开销。它创建了一个全新的解释器,stack,GIL。。。这需要时间。你知道吗
在POSIX系统上,这种开销要快一些,因为它可以使用forking和copy-On-write内存,但在Windows上,这基本上就像是从命令行调用
python -c "from your_script import myfun; myfun('C:/Users/username/Desktop/in.tif', 'C:/Users/username/Desktop/out.tif')"
,而且需要相当长的时间。你知道吗只有当您有相当大的计算需求,并且可以从函数中并行化时,您才会注意到多处理的好处。在this answer中检查一个简单的基准测试。你知道吗
multiprocessing.Pool.map()
不会自动使函数并行运行。所以做Pool.map(my_function(single_input))
不会使它运行得更快。事实上,这可能会使它变慢。你知道吗map()
的目的是,如果您有多个输入,则允许您并行运行同一函数多次。你知道吗如果你有:
然后您可以使用
Pool.map()
来加速您的程序,例如:但是因为只有一个输入,所以只需要运行一次函数,所以没有区别。希望这有帮助。你知道吗
相关问题 更多 >
编程相关推荐