【发布时间】:2017-10-16 15:29:25
【问题描述】:
欧拉计划第十题: 求两百万以下的所有素数之和。 好吧,我想出了两个解决方案:
使用生成器函数
def gen_primes():
n = 2
primes = []
while True:
for p in primes:
if n % p == 0:
break
else:
primes.append(n)
yield n
n += 1
flag = True
sum=0
p=gen_primes()
while flag:
prime=p.__next__()
if prime > 2000000:
flag = False
else:
sum+=prime
print(sum)
无发电机
def prime(number):
if number ==1:
return -1
else:
for a in (range(1,int(number**0.5)+1))[::2]:
if number%a==0 and a!=1:
return False
else:
return True
count=2
for i in (range(1,2000000))[::2]:
if prime(i)==True and i!=1:
count+=i
else:
continue
print(count)
令人惊讶的是,后者(w/o g)需要 7.4 秒,而前者(使用 g)大约需要 10 分钟 !!!
为什么会这样?认为生成器会因为更少的步骤而表现得更好。
【问题讨论】:
-
primes.append(n)那一定是需要时间的事情。你不需要那个。 -
最高效的解决方案是 Erathothenes 的筛子。查一下。
-
这 2 种解决方案几乎不等价;在顶部,您使用
while True,它比for循环慢。此外,您探索的数字范围更有限,因此速度更快也就不足为奇了 -
为什么要使用
while循环并显式调用__next__?只需使用 for 循环,即 整个点。