Python使用并行For循环计算指定窗口大小的滑动中位数问题排查
滑动窗口中位数并行实现修复方案
核心错误原因
- 多进程入口缺失:Windows 环境下使用
multiprocessing模块必须将进程启动逻辑包裹在if __name__ == '__main__'代码块中,否则会无限递归创建子进程,导致程序卡死无输出。 - 并行逻辑设计错误:你当前的代码重复调用完整的滑动窗口计算函数
len(data_arr)次,完全没有实现单窗口计算的拆分并行,且使用的pool.apply是同步阻塞接口,无法发挥多进程并行能力。
修正后可运行代码
import numpy as np import multiprocessing as mp # 单个窗口的中位数计算逻辑,作为并行任务的最小单元 def calc_single_window(args): data_arr, idx, window_size = args return round(np.median(data_arr[idx:idx+window_size]), 1) if __name__ == '__main__': data_arr = np.array([6,7,2,3,4,5,8,8,3,8,6,4,2,5]) window_size = 3 # 计算总窗口数 total_window = len(data_arr) - window_size + 1 # 构造所有并行任务的入参 task_params = [(data_arr, i, window_size) for i in range(total_window)] # 启动多进程并行执行 with mp.Pool(mp.cpu_count()) as pool: smoothed_result = pool.map(calc_single_window, task_params) # 输出结果 print(smoothed_result)
运行输出
执行后会得到你预期的结果:[6.0, 3.0, 3.0, 4.0, 5.0, 8.0, 8.0, 8.0, 6.0, 6.0, 4.0, 4.0]
注意:如果你的输入数据量很小,多进程的进程间通信开销会高于单线程串行循环的性能,只有当数据量很大时并行才有实际收益。
内容的提问来源于stack exchange,提问作者Dilohn Lasdnaym
相关产品推荐
相关产品推荐

