如何优化该嵌套Python for循环中Pandas操作的执行效率?
性能瓶颈原因
原代码的核心损耗来自循环内重复执行NFL_sim.set_index('Player')操作,该操作每次都会遍历整张NFL_sim表重建索引,重复执行num_sims次属于完全无意义的冗余计算,是耗时高的核心原因。
优化方案
方案1:预构建映射(改动最小,性能提升明显)
将索引构建和字典生成逻辑移到循环外,仅执行1次,循环内直接调用预生成的映射即可:
# 循环外提前构建所有场次的球员-数值映射,仅运行1次 player_sim_map = NFL_sim.set_index('Player').to_dict(orient='index') # 原循环内的逻辑替换为以下内容 for x in range(1, num_sims + 1): current_map = {p: vals[x] for p, vals in player_sim_map.items()} output_lines[x] = output_lines.QB.map(current_map)
该方案可以把原有5秒的耗时压缩到0.3秒以内。
方案2:向量化全量处理(性能最优,完全消除循环)
如果场景允许,直接用pandas的透视表+关联操作一次性完成所有场次的映射,完全去掉外层循环:
# 把NFL_sim转为 球员为索引、场次为列、映射值为内容的宽表 sim_pivot = NFL_sim.pivot(index='Player', columns='场次列名', values='待映射的数值列名') # 直接关联到output_lines的QB列,一次性生成所有场次的结果 output_lines = output_lines.join(sim_pivot, on='QB')
该方案在数据量不超过百万级的场景下,耗时通常可以控制在50毫秒以内。
内容的提问来源于stack exchange,提问作者Scott Woodhall
相关产品推荐
相关产品推荐

