Python超大for循环运行过慢,如何大幅缩短4320个矩阵处理的计算耗时?
性能优化方案
你的代码慢的核心原因是用了极低效率的逐行append和纯Python嵌套循环,按照下面的优先级优化,预计耗时可以压缩到几分钟以内:
- 最高优先级优化:废除循环内的pd.append操作
pandas的append方法每次执行都会完整复制现有DataFrame的所有数据,随着数据量增长,单次append的耗时会越来越高,这是你代码跑9天只完成一半的核心原因。正确做法是先把所有行数据存在Python原生列表中,所有计算完成后一次性转为DataFrame,仅这一项优化就能带来至少百倍的提速。 - 第二优先级优化:替换嵌套循环为向量化操作
你用到的H、T参数是固定的等差网格,40×80的矩阵结构和网格完全对应,不需要用while循环逐点遍历,直接预先生成H、T序列,和展平后的功率矩阵直接匹配即可,向量化操作是numpy底层C实现,比纯Python循环快几十倍。 - 第三优先级优化:删除冗余操作
循环内的高频print操作、每次循环都创建空的energy_wave_period_convertedDataFrame(你代码里根本没用这个变量)、逐点做float格式化这些冗余操作都可以删掉或放到最后统一处理,减少不必要的开销。
优化后参考代码
import numpy as np import pandas as pd # 预先定义固定参数,避免循环内重复计算 H_start=0.25 H_end=10 H_step=0.25 T_start=3 T_end=17 T_step=0.177 # 预先生成H、T序列,和矩阵维度完全匹配 H_seq = np.arange(H_start, H_end + H_step, H_step).round(2) T_seq = np.arange(T_start, T_end + T_step, T_step).round(2) # 校验维度和你的40*80矩阵匹配,不对的话微调下序列生成逻辑 assert len(H_seq) == 40 and len(T_seq) == 80, "参数序列长度和矩阵维度不匹配" # 生成H、T网格 H_grid, T_grid = np.meshgrid(H_seq, T_seq, indexing='ij') H_flat = H_grid.flatten() T_flat = T_grid.flatten() all_data = [] indice_4 = 0 configuration_id = -1 n_configurations = 4320 for z in range(n_configurations): # 去掉高频print,真要监控可以每100次打印一次 # if z % 100 == 0: # print(z) power_matrix = P_mat[z].round(2) relative_direction = int(direc[z]) if relative_direction == 0: configuration_id += 1 # print(configuration_id) # 展平功率矩阵,直接批量拼接数据 power_flat = power_matrix.flatten() n_points = len(power_flat) # 生成当前配置的所有行数据 config_ids = np.full(n_points, configuration_id) dir_ids = np.full(n_points, relative_direction) id_seq = np.arange(indice_4, indice_4 + n_points) # 批量加入列表 current_data = np.column_stack([id_seq, config_ids, H_flat, T_flat, dir_ids, power_flat]) all_data.extend(current_data.tolist()) indice_4 += n_points # 一次性生成DataFrame seastate_productivity = pd.DataFrame( all_data, columns=['id','configuration_id','significant_wave_height','energy_wave_period','relative_direction','average_output_power'] ) # 统一转换数值类型 seastate_productivity = seastate_productivity.astype({ 'id': int, 'configuration_id': int, 'relative_direction': int }) # 写入CSV seastate_productivity.to_csv('seastate_productivity.csv',index=False,sep=';')
如果想要进一步提速,可以再结合多进程并行处理4320个矩阵的计算逻辑,耗时还能再降几倍。
内容的提问来源于stack exchange,提问作者Emanuele D'Argenzio
相关产品推荐
相关产品推荐

