6

次のような数値反復を実行できます。

for i in xrange(10):
    print i,

およびCスタイル:

i = 0
while i < 10:
    print i,
    i = i + 1

はい、私は知っています、最初のものはエラーが発生しにくく、よりPythonicですが、Cスタイルバージョンとしては十分に高速ですか?

PS。私はC++の惑星から来ており、Pythonの惑星ではかなり新しいです。

4

7 に答える 7

16

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
于 2009-09-04T09:26:46.257 に答える
15

誰も気にしない?真剣に。知りたい場合は、timeitパッケージを使用してください(コマンドラインから-mを使用して呼び出すことができます)。

しかし、違いはごくわずかなので、それはまったく問題ではありません。そして一般的に、Pythonはスピードが必要な場合に選択する言語ではありません。

于 2009-09-04T05:57:32.263 に答える
3

最初の1つ。

つまり、開発が早くなりますよね?

PS:問題ではありません。最近のマシンは非常に高速であるため、完全なプロファイラーを使用してボトルネックを特定する前に、マイクロ最適化について熟考することは無意味です。

于 2009-09-04T10:48:59.147 に答える
1

それらは両方とも避けるべきです:-)

一般的に言って、数値の反復を見るたびに、リストまたはジェネレーターの反復を使用してより良い方法で表現できる、非Pythonのコードがいくつか表示されます。
実際、私は「pythonic」と言いましたが、それはすべて読みやすさに関するものです。慣用的なコードを使用すると、コンパイラーがコードを最適化する方法をよりよく理解できるため、読みやすさが向上し、最終的にはパフォーマンスも向上します。

于 2009-09-04T08:22:59.020 に答える
1

プログラムが遅すぎる場合は、psycoを使用してみてください。

質問のマイクロ最適化の種類について心配する必要はありません。保守しやすいようにプログラムを作成します (これには、他のプログラマーが読みやすいように、標準の Python スタイルに従うことが含まれます)。

于 2009-09-04T15:42:02.990 に答える
0

Python では、短くてわかりやすいバージョンが常に優れています。range と xrange 関数がネイティブでないことを間違えていなければ、 xrange(sys.maxint+1) を試すと、オーバーフロー エラーが発生します。

それに、これはいったい何の役に立つのだろう?数字を 10 個だけ印刷する場合、読みやすさは確かに 1,000 倍になります。数字を 100 万個以上印刷するとは思えません...

于 2009-09-04T15:45:16.977 に答える
0

数値コードの効率を求めるなら、numpyscipyを使用する必要があります。統合は次のようにすばやく書くことができますnumpy.sum( numpy.arange( 10 ) )

于 2009-09-04T12:31:53.970 に答える