明確にするために、これは宿題の問題ではありません:)
私が構築している数学アプリケーションの素数を見つけたかったのですが、Sieve of Eratosthenesアプローチに出会いました。
私はPythonでそれの実装を書きました。しかし、それはひどく遅いです。たとえば、200 万未満の素数をすべて見つけたいとします。20分以上かかります。(私はこの時点でそれを止めました)。どうすればこれをスピードアップできますか?
def primes_sieve(limit):
limitn = limit+1
primes = range(2, limitn)
for i in primes:
factors = range(i, limitn, i)
for f in factors[1:]:
if f in primes:
primes.remove(f)
return primes
print primes_sieve(2000)
更新: 私はこのコードのプロファイリングを行ってしまい、リストから要素を削除するのにかなりの時間が費やされていることがわかりました。要素を見つけて削除し、リストを再調整するためにリスト全体(最悪の場合)をトラバースする必要があることを考えると、非常に理解できます(おそらくいくつかのコピーが続きますか?)。とにかく、辞書用のリストを取り出しました。私の新しい実装 -
def primes_sieve1(limit):
limitn = limit+1
primes = dict()
for i in range(2, limitn): primes[i] = True
for i in primes:
factors = range(i,limitn, i)
for f in factors[1:]:
primes[f] = False
return [i for i in primes if primes[i]==True]
print primes_sieve1(2000000)