2013-03-24 121 views
0

我想計算所有低於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

回答

3

執行Sieve of Eratosthenes。這會讓你的代碼比現在做的工作少得多,使得代碼更快。

+0

非常感謝,我想不出在我的代碼中使用那個。我會立即嘗試。 – 2013-03-24 14:04:18

0

你可以通過這個替換爲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的方法。