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

如何在Python中对多文件多参数执行并行化处理?

问题:Python多进程并行处理多文件读写(带多参数)

我对Python并不熟悉,但希望在Python中并行运行一个函数来读写多个文件。以下是一个极简示例:

from multiprocessing import Pool
import pandas as pd

def multiple(input_path, output_path, n):
    df = pd.read_csv(input_path, index_col=0)
    new_df = df.multiply(n)
    new_df.to_csv(output_path)

workers = 6
input_filenames = [f'input_i.csv' for i in range(1,11)]
output_filenames = [f'output_i.csv' for i in range(1,11)]

with Pool(workers) as pool:
    pool.map(multiple, ...)

如果使用for循环,我可以这样实现:

for i, input_file in enumerate(input_filenames):
    input_path = input_filenames[i]
    output_path = output_filenames[i]
    multiple(input_path, output_path, 2)

请问如何将其转换为pool.map的写法,以匹配每个输入输出文件名的索引,同时为函数传入三个参数(input_path、output_path、n)?


解决方案

方法1:使用pool.starmap(推荐)

multiprocessing.Pool的starmap方法支持直接传入包含多参数的元组列表,每个元组对应函数的一组参数,是处理多参数并行任务的最优方式。

修改后的完整代码:

from multiprocessing import Pool
import pandas as pd

def multiple(input_path, output_path, n):
    df = pd.read_csv(input_path, index_col=0)
    new_df = df.multiply(n)
    new_df.to_csv(output_path)

workers = 6
# 修正文件名生成逻辑:原写法会生成固定名称input_i.csv,改为input_{i}.csv才能生成input_1.csv、input_2.csv等
input_filenames = [f'input_{i}.csv' for i in range(1,11)]
output_filenames = [f'output_{i}.csv' for i in range(1,11)]

# 打包参数:将每个输入路径、输出路径和固定参数n=2组成元组,生成参数列表
params = list(zip(input_filenames, output_filenames, [2]*len(input_filenames)))

with Pool(workers) as pool:
    pool.starmap(multiple, params)

方法2:用pool.map配合包装函数

如果一定要使用仅支持单参数迭代器的pool.map,可以通过包装函数拆分多参数:

from multiprocessing import Pool
import pandas as pd

def multiple(input_path, output_path, n):
    df = pd.read_csv(input_path, index_col=0)
    new_df = df.multiply(n)
    new_df.to_csv(output_path)

# 包装函数:接收单个元组参数,拆分后调用原函数
def wrapper(args):
    input_path, output_path, n = args
    multiple(input_path, output_path, n)

workers = 6
input_filenames = [f'input_{i}.csv' for i in range(1,11)]
output_filenames = [f'output_{i}.csv' for i in range(1,11)]

params = list(zip(input_filenames, output_filenames, [2]*len(input_filenames)))

with Pool(workers) as pool:
    pool.map(wrapper, params)

关键说明

  • 原代码中f'input_i.csv'是错误写法,会生成固定文件名而非按序号递增的文件,需改为f'input_{i}.csv';
  • [2]*len(input_filenames)用于生成和输入文件列表长度一致的参数列表,确保每个任务都传入n=2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:50:30