次のような数値反復を実行できます。
for i in xrange(10):
print i,
およびCスタイル:
i = 0
while i < 10:
print i,
i = i + 1
はい、私は知っています、最初のものはエラーが発生しにくく、よりPythonicですが、Cスタイルバージョンとしては十分に高速ですか?
PS。私はC++の惑星から来ており、Pythonの惑星ではかなり新しいです。
次のような数値反復を実行できます。
for i in xrange(10):
print i,
およびCスタイル:
i = 0
while i < 10:
print i,
i = i + 1
はい、私は知っています、最初のものはエラーが発生しにくく、よりPythonicですが、Cスタイルバージョンとしては十分に高速ですか?
PS。私はC++の惑星から来ており、Pythonの惑星ではかなり新しいです。
while
バージョンが遅いと思います。Pythonは、ループなどの各ターンで整数オブジェクトの追加操作を検索する必要があります。見た目だけで純粋なCではありません。
また、上記のpythonicバージョンが必要な場合は、次を使用してください。
print " ".join(str(i) for i in xrange(10))
編集:私のタイミングは次のようになります。これは、Pythonで「i + = 1」などを書き出すのにかかる費用を示すために、印刷せずに実行されているばかげたループです。
$ python -mtimeit "i=0" "while i < 1000: i+=1"
1000 loops, best of 3: 303 usec per loop
$ python -mtimeit "for i in xrange(1000): pass"
10000 loops, best of 3: 120 usec per loop
誰も気にしない?真剣に。知りたい場合は、timeitパッケージを使用してください(コマンドラインから-mを使用して呼び出すことができます)。
しかし、違いはごくわずかなので、それはまったく問題ではありません。そして一般的に、Pythonはスピードが必要な場合に選択する言語ではありません。
最初の1つ。
つまり、開発が早くなりますよね?
PS:問題ではありません。最近のマシンは非常に高速であるため、完全なプロファイラーを使用してボトルネックを特定する前に、マイクロ最適化について熟考することは無意味です。
それらは両方とも避けるべきです:-)
一般的に言って、数値の反復を見るたびに、リストまたはジェネレーターの反復を使用してより良い方法で表現できる、非Pythonのコードがいくつか表示されます。
実際、私は「pythonic」と言いましたが、それはすべて読みやすさに関するものです。慣用的なコードを使用すると、コンパイラーがコードを最適化する方法をよりよく理解できるため、読みやすさが向上し、最終的にはパフォーマンスも向上します。
プログラムが遅すぎる場合は、psycoを使用してみてください。
質問のマイクロ最適化の種類について心配する必要はありません。保守しやすいようにプログラムを作成します (これには、他のプログラマーが読みやすいように、標準の Python スタイルに従うことが含まれます)。
Python では、短くてわかりやすいバージョンが常に優れています。range と xrange 関数がネイティブでないことを間違えていなければ、 xrange(sys.maxint+1) を試すと、オーバーフロー エラーが発生します。
それに、これはいったい何の役に立つのだろう?数字を 10 個だけ印刷する場合、読みやすさは確かに 1,000 倍になります。数字を 100 万個以上印刷するとは思えません...