範囲内の素数を生成するために私が見つけた最速の方法は、SymPy シンボリック数学ライブラリを使用することであることを共有したかった:
import sympy
def all_primes(start, end):
return list(sympy.sieve.primerange(start, end))
このsympy.sieve.primerange()
関数はジェネレーターを返すので、それをlist()
リストに変換する必要があります。
これと、このスレッドで現在最も支持されている非常に最適化された回答とのパフォーマンスの違いの例を次に示します。
import sympy
def get_primes_python(start, stop):
dct = {x: True for x in list(range(start, stop+1))}
x = start
while x ** 2 <= stop:
if dct[x]:
y = x ** 2
while y <= stop:
dct[y] = False
y += x
x += 1
lst = []
for x, y in dct.items():
if y:
lst.append(x)
return lst
def get_primes_sympy(start, stop):
return list(sympy.sieve.primerange(start, stop))
In [2]: %timeit test.get_primes_python(1, 10**7)
1 loop, best of 3: 4.21 s per loop
In [3]: %timeit test.get_primes_sympy(1, 10**7)
10 loops, best of 3: 138 ms per loop