python - 查找列表中小于某个数字的最大组合的低效代码
问题描述
我正在尝试 Codewars 问题,但出现超时错误,这表明我的代码执行时间过长且效率低下。老实说,我不知道如何调整我当前的代码以使其更快,但希望得到一些帮助。代码的目的是k
在列表中找到元素组合,该组合ls
导致下面的总和最高t
。我的代码如下:
def choose_best_sum(t, k, ls):
from itertools import product
lists = [(s, sum(s)) for s in product(ls, repeat=k)]
highest_sum = 0
res = None
for i in range(len(lists)):
if lists[i][1]<t and lists[i][1]>highest_sum:
highest_sum = lists[i][1]
res = lists[i][0]
return res
例如,choose_best_sum(174, 3, [50, 55, 57, 58, 60])
应该返回 (55,58,60)
解决方案
性能更高的版本:
import timeit
def find_best_sum(threshold, k, ls):
from itertools import combinations
highest_sum = 0
res = None
for t in combinations(ls, r=k):
s = sum(t)
if s < threshold and s > highest_sum:
highest_sum = s
res = t
return res
print(find_best_sum(174, 3, [50, 55, 57, 58, 60])) # (55, 58, 60)
比较:
print('choose_best_sum', timeit.timeit('choose_best_sum(174, 3, [50, 55, 57, 58, 60])',
setup='from __main__ import choose_best_sum', number=1000))
print('find_best_sum', timeit.timeit('find_best_sum(174, 3, [50, 55, 57, 58, 60])',
setup='from __main__ import find_best_sum', number=1000))
输出(连续):
choose_best_sum 0.053198210999999995
find_best_sum 0.004936765999999981
推荐阅读
- android - 我的 gridView 没有显示在 mainactivity
- javascript - 带有三元组的 Javascript 函数语法 =>
- angular-cli - 使用 @angular-builders/custom-webpack 使用 --watch 在 Angular 构建后添加任务
- ms-access - MS-Access Pro Plus 2016“无法使用”
'; 文件已在使用”Win 10 Pro 64 位 v1909 - javascript - 无法正确使用语义标签
- c# - Visual Studio 解决方案中嵌入式数据库的 SQL 连接字符串
- javascript - 模拟 javascript ES6 构造函数的可接受方式?
- google-play-console - 错误状态:在 Google Play 控制台中创建订阅时出现无人认领的错误
- c# - 将 HTTP 流量从一台 PC 重定向到另一台 PC 的任何方式
- database - Docker 容器上的 Oracle 12c 数据库,状态:不健康