You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何并行处理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内容如下:

NameOutput
SPAC{'gennorm': {'beta': 1.1103780008768631, 'loc': 0.0977722086198811, 'scale': 0.8284342569644088}}

内容的提问来源于stack exchange,提问作者Mikal Fischer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:40:34