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

2024-05-16 07:21:18 发布

您现在位置: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分钟


Tags: pathnamein功能ifmain时间username
2条回答

在子进程中使用相同的参数执行相同的函数-这肯定会比较慢,因为至少创建新进程会有系统开销,然后是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()的目的是,如果您有多个输入,则允许您并行运行同一函数多次。你知道吗

如果你有:

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))

但是因为只有一个输入,所以只需要运行一次函数,所以没有区别。希望这有帮助。你知道吗

相关问题 更多 >