如何在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
相关产品推荐
相关产品推荐

