これは、1つのライナーで指定された数よりも少ない素数を取得するための最速の方法だと思いますか?
[p for p in xrange(3,1000000) if p%2 != 0 and 0 not in (p%d for d in xrange(3,int(p**0.5)+1))]
これは、1つのライナーで指定された数よりも少ない素数を取得するための最速の方法だと思いますか?
[p for p in xrange(3,1000000) if p%2 != 0 and 0 not in (p%d for d in xrange(3,int(p**0.5)+1))]
行は安価であり、必要に応じて複数の行で読み取り可能なコードを記述する必要があると思います。
この場合、必要です。また、Project Euler の問題以外でこれを使用する必要がある場合は、ライブラリにある Prime sieve を使用する必要があります。
コンパクトなコードと効率的なコードを混同しています。上記のコードを効率化する方法はいくつかありますが、1 行で行うか 10 行で行うかは問題ではありません。Python は、人間が読めるコードを実行前にバイトコードにコンパイルします。コードが変換されるバイトコード命令の数を制御することはできません。
リスト内包表記が一般的にfor
ループよりも高速であることは事実ですが、普遍的に当てはまるわけではありません。などの暗黙のループを使用すると、通常は高速になることも一般的に言えmap()
ます。timeit
とモジュールはあなたのdis
友達です。そうすれば、特定のコードが別のコードよりも高速かどうかを自分で確認できます。
時期尚早の最適化は愚かです。いじり始める前に、コードのボトルネックを特定します。上記のコードのどの部分が最も遅くなる可能性があるかを特定できますか?
ええええええ、これを1行で行うべきではありません。理由があります。しかし、私は良い挑戦が好きです。
これは、「合理的に」高速なワンライナーとして思いついたものです。それは素晴らしく複雑な混乱ですが、うまくいきます。それは「より短い」かもしれませんが、「if step%3 or step==3」は実際に作業の 3 分の 1 を排除することで物事をスピードアップすることがわかりました..そして集合内包表記を使用します..リストはソートされているため、sorted() 呼び出しを削除することで一部を削減できます。
[2] + sorted(set(xrange(3,max,2)) - { x for step in xrange(3, int(max**0.5) + 1, 2) if step %3 or step==3 for x in xrange(step * 3, max, step * 2)} )
同じことを考えていました...なぜそれだけではないのですか:
[2] + [x for x in xrange(3,max,2) if not [y for y in xrange(3,int(x**0.5)+1,2) if x%y==0]]