如何让Python更快地工作?

问题描述:

我想计算所有低于200万的素数的总和,因为我已经编写了一个函数来查找小于给定数字的素数,所以我简单地写了一个新函数来调用旧函数,将该列表中的项目相加。如何让Python更快地工作?

但它似乎是永远。我怎样才能加快这个代码?

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的新手,所以如果你能很好地解释我的错误,我会很高兴。提前致谢。

+3

让你的代码更聪明地工作吗? – 2013-03-24 13:58:22

+0

顺便说一下,条件'i!= fac'总是* true,因为'range'不会产生“停止”参数,因此每个循环都进行无用的比较(尽管它应该相当快) 。 – Bakuriu 2013-03-24 14:06:41

执行Sieve of Eratosthenes。这会让你的代码比现在做的工作少得多,使得代码更快。

+0

非常感谢,我想不出在我的代码中使用那个。我会立即尝试。 – 2013-03-24 14:04:18

你可以通过这个替换为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的方法。