[解決済み】エラトステネスのふるい - 素数を求める Python
質問
はっきり言って、これは宿題の問題ではありません :)
今作っている数学のアプリケーションのために素数を探したいと思っていたら、次のようなものに出会いました。 エラトステネスの篩(ふるい のアプローチになります。
私は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)
UPDATEです。 このコードのプロファイリングをしてみたところ、リストから要素を削除するのに非常に多くの時間が費やされていることがわかりました。最悪の場合)リスト全体を走査して要素を見つけ、それを削除してリストを再調整しなければならないことを考えると、非常に理解しやすい。とにかく、私はリストを捨てて、辞書を作った。私の新しい実装は
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)
解決方法は?
正しいアルゴリズムを実装しているとは言い難い。
最初の例では
primes_sieve
は、(アルゴリズムのように)プライマリフラグを打ったり外したりするリストを保持せず、代わりに整数のリストを連続的にリサイズします。これは非常に高価です。
2つ目の例では
primes_sieve1
を維持します。
ディクショナリー
これは正しい方向への一歩ですが、辞書を不定な順序で繰り返し、(アルゴリズムのように素数の素数だけでなく)素数の素数を冗長に取り出しています。この問題は、キーをソートして素数以外をスキップすることで解決できますが(これですでに1桁速くなります)、それでもリストを直接使用する方がはるかに効率的です。
正しいアルゴリズム(辞書の代わりにリストを使用)は、次のようになります。
def primes_sieve2(limit):
a = [True] * limit # Initialize the primality list
a[0] = a[1] = False
for (i, isprime) in enumerate(a):
if isprime:
yield i
for n in range(i*i, limit, i): # Mark factors non-prime
a[n] = False
(なお、これには、プライムのマス目からプライム以外のマーキングを開始するというアルゴリズムの最適化も含まれています(
i*i
) の2倍ではなく、3倍です)。
関連
-
PythonはWordの読み書きの変更操作を実装している
-
python implement mysql add delete check change サンプルコード
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 可視化 big_screen ライブラリ サンプル 詳細
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
任意波形を生成してtxtで保存するためのPython実装
-
Pythonショートビデオクローラーチュートリアル
-
PythonによるExcelファイルの一括操作の説明
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。