如何并行化Python中的ProcessGrid函数循环?已尝试多模块仍困惑
嘿,我懂你这种对着文档抓耳挠腮却摸不着门道的感觉!既然你的循环执行顺序完全不影响结果,那这几个并行模块都能轻松搞定,我给你逐个拆解,直接上可运行的代码示例,一看就明白:
用concurrent.futures实现并行(最简洁直观)
这个模块是Python标准库,语法清晰,还能灵活切换线程/进程并行:
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor def ProcessGrid(Grid): # 先把单个Grid元素的两个操作打包成一个函数 def process_single(grid_item, full_grid): grid_item.AdjustCostMultiplier() grid_item.FindAllNeighbours(full_grid) # 划重点:CPU密集型任务选ProcessPoolExecutor(利用多核),IO密集型选ThreadPoolExecutor with ProcessPoolExecutor() as executor: # 给每个Grid元素提交一个并行任务 futures = [executor.submit(process_single, Grid[i], Grid) for i in range(len(Grid))] # 等待所有任务执行完成 for future in futures: future.result() print("P...")
如果你的AdjustCostMultiplier()和FindAllNeighbours()是IO密集型(比如有文件读写、网络请求),把ProcessPoolExecutor换成ThreadPoolExecutor就行,其他代码不用改。
用joblib实现并行(语法极简,适合批量任务)
joblib专门为批量并行任务设计,语法比concurrent.futures更简洁,尤其适合数据处理/机器学习场景:
from joblib import Parallel, delayed def ProcessGrid(Grid): def process_single(grid_item, full_grid): grid_item.AdjustCostMultiplier() grid_item.FindAllNeighbours(full_grid) # n_jobs=-1表示自动用满所有CPU核心;要线程并行的话加backend="threading" Parallel(n_jobs=-1)(delayed(process_single)(Grid[i], Grid) for i in range(len(Grid))) print("P...")
delayed用来包装要执行的函数和参数,Parallel负责调度任务,一行代码就搞定并行,非常省心。
用multiprocessing实现并行(更底层,灵活性更高)
如果你需要更精细地控制进程池,可以用Python标准库的multiprocessing模块:
from multiprocessing import Pool def ProcessGrid(Grid): # 注意:Pool的map方法只能接收单个参数,所以把两个参数打包成元组 def process_single(args): grid_item, full_grid = args grid_item.AdjustCostMultiplier() grid_item.FindAllNeighbours(full_grid) with Pool() as pool: # 把每个任务的参数打包成元组列表,传给map方法 pool.map(process_single, [(Grid[i], Grid) for i in range(len(Grid))]) print("P...")
要是想换成线程池,只需要把导入改成from multiprocessing.dummy import Pool,用法完全一样。
关键注意事项
- 确保你的
Grid类及其方法是可序列化的(也就是能被Python的pickle模块序列化),因为多进程模式下,对象需要在不同进程间传递,pickle是默认的序列化方式。如果你的Grid里有不可序列化的属性(比如打开的文件句柄、某些C扩展对象),要么换成线程并行,要么修改类让它支持序列化。 - 如果每个Grid元素的处理时间很短,并行的开销(进程/线程创建、数据传递)可能会抵消加速效果,这种情况下串行反而更快。但如果每个元素处理时间较长,并行的收益会很明显。
- 因为你的循环顺序无关,所以不用考虑任务执行的先后顺序,以上方案都完美适配。
内容的提问来源于stack exchange,提问作者Mark Kavanagh
相关产品推荐
相关产品推荐

