如何并行化Pandas中的循环操作以提升计算效率?
并行化实现方案
核心思路
针对你代码里串行执行转换任务的问题,用Python的concurrent.futures.ThreadPoolExecutor就能实现并行处理——你的任务主要是time.sleep这类IO等待操作,线程池开销比进程池更低,能让所有任务同时执行,且最终输出的merged_df和原代码完全一致。
修改后的完整代码
import pandas as pd import numpy as np from datetime import datetime, timedelta import time from concurrent.futures import ThreadPoolExecutor # 生成未来一年的日期范围 start_date = datetime.now() end_date = start_date + timedelta(days=365) date_range = pd.date_range(start=start_date, end=end_date, freq='D') # 生成时间序列的随机整数值 num_days = len(date_range) random_values = np.random.randint(low=0, high=100, size=num_days) # 创建DataFrame data = {'Date': date_range, 'Value': random_values} df = pd.DataFrame(data) def transform_dataframe(task_args): # 适配线程池参数传递规则,接收元组形式的参数 df_copy, mult, pow_val, setname = task_args time.sleep(2) # 原代码的2000秒应为笔误,改为2秒方便测试,实际可改回原数值 df_copy['value_mult'] = df_copy['Value'] * mult df_copy['value_pow'] = df_copy['Value'] ** pow_val df_copy = df_copy[['Date', 'value_mult', 'value_pow']] df_copy.rename(columns={'value_mult': f'{setname}_value_mult', 'value_pow': f'{setname}_value_pow'}, inplace=True) return df_copy, setname transforms = [(2, 3, 'set1'), (0.5, 2, 'set2'), (3, 0.5, 'set3'), (1.5, 2.5, 'set4')] # 准备任务参数:每个任务传入独立的df副本,避免并发数据冲突 task_list = [(df.copy(), mult, pow_val, setname) for mult, pow_val, setname in transforms] # 并行执行所有转换任务 transformed_dfs = [] with ThreadPoolExecutor(max_workers=len(transforms)) as executor: # map方法会保持结果顺序和任务提交顺序一致,和原串行逻辑完全匹配 for result in executor.map(transform_dataframe, task_list): transformed_df, _ = result transformed_dfs.append(transformed_df) # 合并结果,生成和原代码结构相同的merged_df merged_df = pd.concat(transformed_dfs, keys=[f'{setname} Transform' for _, _, setname in transforms])
关键细节说明
- 参数适配:调整
transform_dataframe函数接收单参数元组,适配ThreadPoolExecutor.map的参数传递规则 - 并发安全:每个任务传入
df.copy(),确保多线程操作独立的DataFrame副本,避免数据冲突 - 顺序保证:
executor.map按任务提交顺序返回结果,最终merged_df的结构和原串行代码完全一致 - 线程数设置:将
max_workers设为任务总数(4个),确保所有任务可同时启动执行
内容的提问来源于stack exchange,提问作者r ram
相关产品推荐
相关产品推荐

