如何并行处理Python列遍历循环,处理行号n与文件写入?
并行处理分布拟合循环的实现方案
问题核心
需要并行遍历数据集的每一列,用Fitter拟合最佳分布并将结果写入CSV,不确定如何处理原代码中的行号n,且无并行处理经验。
关键说明
原代码中的n是手动维护的行索引,并行场景下完全不需要手动处理——每个子进程只需返回对应列的结果,主进程收集所有结果后统一构建DataFrame,索引会自动生成,避免多进程间的索引冲突。
另外,原代码中每次循环写入CSV、以及错误的IPython.Application.instance().kernal.do_shutdown(True)(拼写错误+不必要操作)都需要修正:多进程同时写文件会导致数据混乱,应在所有任务完成后一次性写入CSV。
完整实现代码
import multiprocessing as mp import pandas as pd from fitter import Fitter, get_common_distributions # 建议先用常用分布测试,效率更高 # 定义单个列的处理函数(每个子进程执行这个函数) def process_column(col_name, dataset): # 获取列数据 col_data = dataset[col_name].values # 初始化Fitter,这里用get_common_distributions()替代全分布,大幅提升速度 f = Fitter(col_data, distributions=get_common_distributions()) f.fit() # 返回列名和最佳分布结果 return (col_name, f.get_best(method='sumsquare_error')) if __name__ == '__main__': # 读取数据集 dataset = pd.read_csv("econ.csv") # 创建进程池,进程数建议设为CPU核心数(默认就是) with mp.Pool() as pool: # 并行处理所有列:用starmap传递多参数(列名+数据集) results = pool.starmap(process_column, [(col, dataset) for col in dataset.columns]) # 将结果转换为DataFrame df = pd.DataFrame(results, columns=['Name', 'Output']) # 一次性写入CSV df.to_csv('dist.csv', index=False) print(df)
代码关键点解释
- 进程安全的任务拆分:每个子进程独立处理单个列,返回(列名,结果)元组,完全避免了原代码中
n的维护问题。 - 避免多进程写文件冲突:所有子进程只负责计算,主进程收集完所有结果后统一写入CSV,保证数据完整性。
- 效率优化:用
get_common_distributions()替代get_distributions(),后者会遍历所有可用分布(上百种),拟合耗时极长,建议先常用分布测试,再按需扩展。 if __name__ == '__main__':Windows系统下必须加这行,避免进程启动时的递归导入问题,Linux/macOS也建议加上保证兼容性。
示例输出
生成的dist.csv内容如下:
| Name | Output |
|---|---|
| SPAC | {'gennorm': {'beta': 1.1103780008768631, 'loc': 0.0977722086198811, 'scale': 0.8284342569644088}} |
内容的提问来源于stack exchange,提问作者Mikal Fischer
相关产品推荐
相关产品推荐

