Python功能优化:长列表遍历代码性能提升需求
优化长列表处理代码的高效方案
嘿,我帮你看看这段代码的优化空间!首先得说,你现在的问题核心在于遍历列表时直接修改它,加上不必要的全量统计,导致效率极低——毕竟57选6的组合数超过360万,每一步低效操作都会被放大无数倍。
原代码的核心问题
- 遍历中修改列表的致命问题:你在遍历
listCombinaisons_survivor时调用remove(elt),这会触发列表的元素前移操作(O(n)复杂度),而且会导致后续遍历跳过部分元素,既慢又可能引入逻辑错误。 - 冗余的全量统计:每次都用
Counter统计所有6个元素的效果次数,但其实只要发现任意一种效果超过3次,就可以直接判定这个组合无效,没必要统计完所有元素。
优化后的代码方案
先给你最直接的优化版本,针对已生成的组合列表:
from collections import defaultdict # 预先提取徽章ID到效果的映射(让代码更清晰,查询效率和原代码一致) badge_effect_map = {bid: details["Effect"] for bid, details in dictBadges.items()} filtered_combinations = [] for combo in listCombinaisons_survivor: effect_counts = defaultdict(int) is_valid = True for bid in combo: effect = badge_effect_map[bid] effect_counts[effect] += 1 # 一旦发现某个效果次数超过3,立刻终止当前组合的统计 if effect_counts[effect] > 3: is_valid = False break if is_valid: filtered_combinations.append(combo) # 替换原列表 listCombinaisons_survivor = filtered_combinations
如果你的listCombinaisons_survivor是预先用itertools.combinations生成的,那可以更进一步,边生成边筛选,避免一次性把360多万个组合加载到内存里,内存和速度都会更优:
import itertools from collections import defaultdict # 假设dictBadges的键就是徽章ID badge_ids = list(dictBadges.keys()) badge_effect_map = {bid: details["Effect"] for bid, details in dictBadges.items()} listCombinaisons_survivor = [] for combo in itertools.combinations(badge_ids, 6): effect_counts = defaultdict(int) is_valid = True for bid in combo: effect = badge_effect_map[bid] effect_counts[effect] += 1 if effect_counts[effect] > 3: is_valid = False break if is_valid: listCombinaisons_survivor.append(combo)
优化逻辑说明
- 移除遍历中修改列表的操作:用新列表存储符合条件的组合,只遍历原列表一次,时间复杂度从O(n²)降到O(n*6)(每个组合固定6个元素)。
- 提前终止统计:一旦发现某个效果次数超过3,立刻停止当前组合的后续元素统计,节省大量不必要的计算。
- 内存优化(可选):边生成边筛选的方式,不需要预先存储所有组合,内存占用会大幅降低,尤其适合处理超大规模组合场景。
内容的提问来源于stack exchange,提问作者Lory Michel
相关产品推荐
相关产品推荐

