python - 在列表中查找小于特定数字的最大组合时代码效率低下

标签 python

我正在尝试提出 Codewars 问题,但出现超时错误,这表明我的代码执行时间太长且效率低下。老实说,我不知道如何调整当前的代码以使其更快,但需要一些帮助。该代码的目的是在列表 ls 中找到 k 元素的组合,从而得出低于 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

关于python - 在列表中查找小于特定数字的最大组合时代码效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57207081/

相关文章:

Python 共享内存数组,没有属性 get_obj()

python - AWS CDK如何在网关lambda集成的请求模板中嵌入自定义java脚本

python - 用 python 在蓝牙低功耗中编写广告包?

python - 如何在不呈现内容的按钮按下时运行 Django 函数?

python - 我可以使用 lambdify 来评估 python 函数的导数吗?

python - 在 Rmd 文件中使用 python block 时抑制警告

python - 从文件名读取单页 .tif 文件作为 multipage.tiff

python - 在下面的代码示例中,如何计算Python中输出的每个字典值?

python - 如何向 CSV 文件添加新列?

python - 为什么 Python 的导入不能像 C 的#include 那样工作?