Python多层嵌套for循环优化:如何提升代码运行速度?
优化硬币组合生成代码:从80秒到毫秒级
原代码核心问题分析
你的代码之所以效率极低,根源在于错误生成了大量冗余组合,最后依赖集合去重,完全做了无用功:
- 你需要的是r枚硬币的所有可能组合,本质是求列表T的r次笛卡尔积(每个位置独立选N/P),不存在重复,根本不需要去重。
mult_comb函数的三层嵌套循环逻辑错误:其中for _ in range(len(T))是完全多余的循环,它会让同一个基础组合重复添加len(T)次新元素,导致中间列表的大小指数级膨胀(比如k=12时,中间列表会生成419万+条数据,而实际只需要4096条)。- 最终转集合去重的操作,在数据量巨大时会占用大量CPU和内存,这是耗时的关键。
优化方案1:使用标准库itertools.product(最推荐)
Python的itertools.product是专门生成笛卡尔积的工具,底层由C实现,效率极高,直接生成所有目标组合,无冗余数据。
from time import time import itertools def all_possible_combinations(T: list, r: int) -> list: # 生成r次笛卡尔积,转换为列表并排序 return sorted(itertools.product(T, repeat=r)) if __name__ == "__main__": start: float = time() n, k = ['N', 'P'], 12 data: list = all_possible_combinations(n, k) print(data) print(f"The runtime took: {time() - start:.3f}s")
运行效果:k=12时,耗时通常在0.001~0.005秒之间,比原代码快数万倍。
优化方案2:手动实现笛卡尔积(不依赖标准库)
如果不想用itertools,可以手动实现无冗余的笛卡尔积生成逻辑:
from time import time def all_possible_combinations(T: list, r: int) -> list: combinations = [()] for _ in range(r): # 每次迭代给所有现有组合末尾添加T中的元素,无冗余 combinations = [comb + (t,) for t in T for comb in combinations] return sorted(combinations) if __name__ == "__main__": start: float = time() n, k = ['N', 'P'], 12 data: list = all_possible_combinations(n, k) print(data) print(f"The runtime took: {time() - start:.3f}s")
这个方法从空元组开始,每次迭代精准生成新的组合,最终得到恰好2^r条数据,运行速度接近itertools版本。
内容的提问来源于stack exchange,提问作者EintsWaveX
相关产品推荐
相关产品推荐

