0

Python/プログラミングの経験があまりない。10 億から 10 億までのすべての数値をテストしてから、特定の数値をリストに追加する必要があります。現在、 range( 0 , Billion ) を使用しようとしていますが、Python 3.3 を使用しているマシンで実行するには約 80 秒かかることがわかりました。これを行うためのはるかに効率的な方法はありますか?

for i in range(0, Billion)
    # if i passes test
    i.append(samplelist)
4

3 に答える 3

3

いいえ。マシン時間の観点から、所有しているコードについて考えてください。テスト関数と追加関数に触れることはできないので、私たちが残しているのは範囲内のiだけです。これは基本的なforループであり、可能な限り必要最低限​​のものです。whileループを記述し、別の行を記述して自分でインクリメントすることもできますが、Pythonインタープリターをさらに呼び出して処理する必要があるため、実際には実行時間が長くなると思います。

考え直して、テストルーチンを最適化できれば...

于 2013-03-06T03:13:19.783 に答える
2

通常、1000000000 まで繰り返す必要がある場合は、もっと良い方法があります。たとえば、いくつかの数学的プロパティを使用して、すべての数値のテストを回避できます。

samplelist = [x**2 for x in range(int(1000000000**0.5))] # get all perfect squares up to 1000000000

Python は、数値演算に関してそれほど高速ではありません。したがって、1000000000 まで反復し、反復ごとに何かを実行すると遅くなります。これを回避するには、より高速なインタープリター (PyPy など) を試すか、C などのよりパフォーマンスの高い言語でコードを記述します。


または、膨大な数の要素をリストに追加する場合は、代わりにジェネレーターの使用を検討してください。これにより、大量のリストを作成するオーバーヘッドが回避されますが、多くのことに役立ちます。

def gen_numbers(n):
    for i in range(n):
        if <i passes test>:
            yield i

for i in gen_numbers(1000000000):
    print(i)
于 2013-03-06T03:11:34.857 に答える
0

これは少し速くなるはずですが、ほとんどの時間はおそらく呼び出しに費やされますsome_test()

samplelist = [i for i in range(1000000000) if some_test(i)]
于 2013-03-06T03:11:28.073 に答える