2017-06-11 5 views
1

素数を計算するコードをいくつか作っています(私が知っている特別なことは何もありません)。予想通り、数値が大きくなると速度が遅くなりますが、数字に関係なく同じ速度にすることは不可能ですが、それは高速ですが、私は方法がわからない...このPythonコードを高速化するにはどうすればよいですか?

import time 
number = 1000000001 
count = 0 
start = time.time() 
while number > 1000000000 and number < 10000000000000: 
    for i in range(1, round(number/2 + 1)): 
     if (number/i).is_integer(): 
      count += 1 
     if count > 1: 
      break 
    if count < 2: 
     print(str(number) + ' prime') 
    number = number + 1 
    count = 0 
end = time.time() 
print(end - start) 
+5

[N以下のすべての素数をリストする最速の方法](https://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n) – hallaksec

+3

まずはPython遅い。第二に、素数を見つけるための非常に高度で理解しにくいアルゴリズムがたくさんあります。これは5分間の話題ではありません。 – freakish

+3

http://primesieve.org/に従って、[sieve](https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes) – khelwood

答えて

4

いくつかのこと:

  • あなたは1からチェックする必要がありますが、35およびすべての奇数番号はありません。
  • n/2まで確認する必要はありませんが、sqrt(n)で停止できます。
  • 除算を使用しないでください。浮動小数点数を扱うので、%を使用してモジュロをチェックしてください。
  • あなたは奇数(または2)をチェックするだけです。
  • whileループのチェックより大きい値を省略することができます。これは、数字が増分するだけであるためです。

だから改良版は、次のようになります。

import time 
from math import sqrt # import square root 

start = time.time() 

for number in range(1000000001,10000000000000,2): # use for, hops of 2 
    for i in range(3, int(sqrt(number))+1,2): # check 3, 5,... up to sqrt(n) 
     if number % i == 0: # use modulo checks instead of floating point 
      break 
    else: # use a for-else structure for faster ending 
     print(str(number) + ' prime') 
    count = 0 
end = time.time() 
print(end - start)

それにも関わらず、Pythonのは、CPUを最大限に活用するために設計されていません。超最適化されたアルゴリズムを実際にコーディングしたい場合は、より高速なプログラミング言語を選ぶ必要があります。

+1

'for n in range(number、10000000000000、2)'を使用できます。 'for'ループは' while'ループより高速です。 – FJSevilla

+1

これは非常に役立ちます、私は素数を印刷せず、リストにそれらを追加して、リストの印刷が完了したら、はるかに高速です。 – Qwertykey

関連する問題