2016-05-16 14 views
-1

私はこの場合、特定の数-2 000 000以下のすべての素数の合計を計算するために以下のコードブロックを書いていますが、実行する; 20秒:Pythonの与えられた数よりも下の総数の合計

def summation_of_primes_below_n(n): 
list = [] 
sum = 0 
for i in range(2, n): 
    if checks_if_prime(i) == True: 
     list.append(i) 
return list 
for j in list: 
    sum = sum + j 
return sum 

def checks_if_prime(n): 
    if n == 2: 
     return True 
    import math 
    for i in range(2, math.ceil(math.sqrt(n))+1): 
     if n%i == 0: 
      return False 
     elif i == math.ceil(math.sqrt(n)): 
      return True 

print(summation_of_primes_below_n(2000000)) 

私のコードをより効率的にする方法があるかどうかは疑問でした。私は同じことについて適切なアドバイスをいただければ幸いです。また、私は初心者であり、同じロジックを提供するので、より基本的なソリューションを提供することをお勧めします。どうもありがとう!

+2

重複:http://stackoverflow.com/q/2068372/3651800 –

+1

コードに字下げを固定する心はありますか?そのまま再生することはできません。 –

答えて

2

より良いアルゴリズムを実装することから始めましょう。 Sieve of Eratosthenes

それとも、あなたの現在のロジックに満足している場合は、助けることができ、その後、いくつかの最適化:奇数のみのため

  • チェック:のみ

    for i in range(3, n, 2):

  • 確認などのために書式番号の場合6n+1, 6n+5

  • あなたは必要ありませんこのチェックを行うには、各反復ごとにelif i == math.ceil(math.sqrt(n)):を入力します。コントロールがループを越えて到達した場合、数字は素数です

  • check_primegenerator patternに変換できます。いくつかの冗長性を節約し、参照のローカリティを改善する可能性があります。

+0

エラトステネスのふるいは、私たちがどこまで行きたいかを知っているので、ここでは最高のものです。 – asb

+0

@RoryDaultonああ、そうです。何とかそれを逃した。 – bashrc

関連する問題