我需要我的代码更快地工作,这个我目前有时甚至需要5秒才能打印答案。
import math
n, k = [int(x) for x in input().split()]
myList = [int(i) for i in input().split()]
range_is = math.factorial(n) / (math.factorial(3) * math.factorial(n-3))
range_is = int(range_is)
answer_list = []
q = 0
w = 1
e = 2
for l in range(range_is):
o = myList[q]+myList[w]+myList[e]
answer_list.append(o)
if e == n-1 and w == n-2 and q != n-3:
q = q+1
w = q+1
e = w+1
elif e == n-1 and w != n-2:
w = w+1
e = w+1
elif e != n:
e = e+1
answer_list.sort()
print(answer_list[k-1])
如何让它跑得更快?这段代码中的问题是什么,以后我可以避免这个问题?
答案 0 :(得分:2)
总结:
n
整数列表。p
整数的每个组合。k
- 总和。itertools.combinations
通过此描述,代码变得简单:
from itertools import combinations
n = 5
p = 3
k = 4
integers = range(1, n + 1)
triples = combinations(integers, p)
# [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)]
triple_sums = [sum(t) for t in triples]
# [6, 7, 8, 8, 9, 10, 9, 10, 11, 12]
triple_sums.sort()
# [6, 7, 8, 8, 9, 9, 10, 10, 11, 12]
print(triple_sums[k - 1])
# 8
使用itertools.combinations
可能会加快您的代码速度,尤其是因为您不需要为大型math.factorial(n)
计算n
。
最重要的是,这段代码更简洁,更好地展示了你的意图。
令人遗憾的是,即使triple_sums
已排序,integers
也未排序。需要计算每个组合,并且必须对整个列表进行排序。可能有另一种方法来生成triple_sums
将直接排序的组合,但我想不出任何组合。
如果您的列表有7000个整数,则会有57142169000
个三元组。使用itertools
对性能无济于事。您需要提供有关列表和k
的更多信息。
答案 1 :(得分:-4)
一些建议:
1,使用python 2代替python 3。
2,计算大数时, 使用“xrange”代替“range”; 使用“ifilter”而不是“filter”。
3,如果使用迭代算法,请尝试使用“yield”。