range と numpy.arange は速度が大違い。numpy.range を使うべし。
import numpy as np
def Eratosthenes(n):
""" n 以下の素数をエラトステネスの篩で生成 """
tbl = np.arange(n+1, dtype=int)
tbl[1] = 0
for i in range(2, int( np.sqrt(n))+1):
if tbl[i]:
tbl[range(2*i, n+1, i)] = 0
return tbl[tbl > 0]
def Eratosthenes2(n):
""" n 以下の素数をエラトステネスの篩で生成 """
tbl = np.arange(n+1, dtype=int)
tbl[1] = 0
for i in range(2, int(np.sqrt(n))+1):
if tbl[i]:
tbl[np.arange(2*i, n+1, i)] = 0
return tbl[tbl > 0]
from time import time as t
s = t();a = Eratosthenes(10000000);print(t()-s) # 4.958sec
s = t();b = Eratosthenes2(10000000);print(t()-s) # 0.268sec
な,な,なんと!18 倍も違う。
※コメント投稿者のブログIDはブログ作成者のみに通知されます