我正在尝试计算低于200万的所有素数的总和,因为我已经编写了一个函数来找到小于给定数的素数,我只是写了一个新函数来调用旧函数并总结该列表中的项目。
但似乎它需要永远。如何加快此代码的速度?
def find_primes(n):
"Find the prime numbers below n"
primes=[];
for i in range(2,n):
for fac in range (2,i):
if i!=fac and i%fac == 0:
break
else:
primes.append(i)
return primes
def add_primes(m):
"Sum all the prime numbers below m"
newlist=find_primes(m);
t=sum(newlist);
return t
PS:我对Python很新手,所以如果你能很好地解释我的错误,我会很高兴的。提前谢谢。
答案 0 :(得分:3)
实施Sieve of Eratosthenes。这将使您的代码所做的工作比目前的工作少得多,使其快得多。
答案 1 :(得分:0)
您可以将for fac in range (2,i)
行替换为:
for fac in primes:
代码:
def find_primes1(n):
"Find the prime numbers below n"
primes=[2,3] #initialize primes with 2 values
for i in range(4,n):
for fac in primes:
if i!=fac and i%fac == 0:
break
else:
primes.append(i)
return primes
时间比较:
In [6]: %timeit find_primes(10**4) # your version
1 loops, best of 3: 2.33 s per loop
In [7]: %timeit find_primes1(10**4)
1 loops, best of 3: 171 ms per loop
In [8]: find_primes1(10**3)==find_primes(10**3)
Out[8]: True
但是对于较大的值,您一定要学习Sieve of Eratosthenes方法。