0

最近、Pythonで素数のリストを生成する非常にコンパクトな方法を読みました

#'prime' should be a pre-defined upper bound of the range
filter(lambda prime:all(prime%num for num in range(2,prime)),range(2,prime))

素数を生成するためにこれを適応させるにprosはどうすればよいですか?consPythonicですか?

私の個人的な考えは、それがちょっと読みやすく、非常に単純化されていることです。それがコーディングに適しているかどうかはわかりません。また、コードが効率的であるとは確信していません。

4

4 に答える 4

3

そのprime = 10000コードでは78021分割を実行しますが、従来の方法では2302以下が必要です。

http://ideone.com/X0MhGO

奇数のみをチェックしてsqrt(x):で停止することにより、メソッドを改善できます。

primes = [2] + filter(lambda p: all(p % n for n in range(3, int(sqrt(p)) + 1, 2)), range(3, max, 2))

これは「従来の」アルゴよりもさらに悪いですが、元のアルゴよりもはるかに優れています(2351 div vs 78021)。

于 2012-12-24T06:21:21.113 に答える
1

長所と短所は、構文ではなく、ほとんどがアルゴリズムです。このコードは素数を生成するためにナイーブな方法を使用しており、いくつかの最適化を行うことはできますが、パフォーマンスの問題が発生した場合は、十分に確立されたアルゴリズムを使用することをお勧めします。それ以外の場合は、実際には問題ではありませんが、個人的には上記のコードをジェネレーター式として記述します。

(cand for cand in range(2,upper_limit) if all(cand%num for num in range(2,cand)))

(注:prime元のコードで名前が付けられた2つの無関係な変数があるため、適切と思われる名前に変更しました)

于 2012-12-24T06:21:47.633 に答える
0

短所:ジェネレーターの方が適しています。また、かなり遅いと思います。

長所:すべての素数がリストに追加されます。これはプラスだと思います。

これが私が素数の周りで使う関数です。

于 2012-12-24T06:09:48.483 に答える
0

より良い方法があります、この機能はこれらの理由で遅いです:

  • 2を除くすべての偶数は素数ではないため、2 x 2に単純化できる場合は、1つずつ通過します。

  • また、平方根を超える因子が発生しない場合は、最終的な数値までループします。

これは、数が素数であるかどうかをチェックするためのより良い関数の例です。

少なくともスピードを求めているのなら、それが主な問題です。

于 2012-12-24T06:14:30.917 に答える