You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:35:16