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

时间:2017-07-02 10:44:29

标签: python python-2.7 multiprocessing python-multiprocessing

我已经创建了一个图像处理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分钟

2 个答案:

答案 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中的简单基准。