【发布时间】:2020-06-13 10:04:30
【问题描述】:
我最近开始学习 python,并且正在使用 CodeWars 进行训练。任务是返回一个列表[p, p + 4, p + 6, p + 10, p + 12, p + 16],其中所有的都是素数。它们的总和应该高于 sum_limit。对于低值,它正在工作,但在高值(大约 200 万)时,运行时间很高。如何减少运行时间?
from math import sqrt; from itertools import count, islice
def find_primes_sextuplet(sum_limit):
for x in range(sum_limit):
if isPrime(x) and isPrime(x+4) and isPrime(x+6) and isPrime(x+10) and isPrime(x+12) and isPrime(x+16):
possible = [x, x+4, x+6, x+10, x+12, x+16]
if sum(possible) > sum_limit:
return possible
def isPrime(n):
return n > 1 and all(n%i for i in islice(count(2), int(sqrt(n)-1)))
print(find_primes_sextuplet(2000000))
【问题讨论】:
-
你的时间复杂度很高。事实是这种计算是相当密集的。话虽如此,您可以进行很多优化。例如
range(sum_limit)可以是range(3, sum_limit, 2)。这消除了一半要检查的数字。另外,也许最好先筛选sum_limit下的素数,然后检查任何 6 个连续素数是否相隔 4、2、4、2、4 的空间。