python - 为什么我的代码查找大数字组合的速度如此之慢?
问题描述
我的代码查找具有给定总和的数字列表的所有组合。代码运行良好,但在尝试大数字(如 100 或 200)时,代码花费的时间太长。
关于如何使代码更快的任何建议?
def check(target, lst):
def _a(idx, l, r, t):
if t == sum(l): r.append(l)
elif t < sum(l): return
for u in range(idx, len(lst)):
_a(u, l + [lst[u]], r, t)
return r
return len(_a(0, [], [], target))
print(check(200, (1, 2, 5, 10, 20, 50, 100, 200, 500)))
解决方案
让内部函数更简单(只给它索引和剩余目标,并返回数字)然后记忆它?
from functools import lru_cache
def check(target, lst):
@lru_cache(None)
def a(idx, t):
if t == 0: return 1
elif t < 0: return 0
return sum(a(u, t - lst[u])
for u in range(idx, len(lst)))
return a(0, target)
print(check(200, (1, 2, 5, 10, 20, 50, 100, 200, 500)))
推荐阅读
- python - 如何获得距离矩阵的逆?
- c# - ImmutableSortedDictionary 中的 .Values 和 .Keys 是否保证被排序?
- mqtt - 自桥接 Mosquitto MQTT 代理
- python - 如何从 WTForms 中的提交按钮显示模式?
- selenium - 想要为不同的功能使用相同的数据提供者但不同的 excel 路径以在 selenium 中提供数据
- python - 是否可以从 concurrent.futures.Future 获取状态或部分结果?
- discord - 预期声明或声明。ts(1128) (11, 1)
- vba - VBA 提取第一个 Google 搜索结果 URL 错误
- python - 我如何输入路径并在同一路径中创建所有 csv 文件的 hdf5 文件?
- laravel - 如何生成 PayPal 订单支付链接到电子邮件