5

私はいくつかのPythonベンチマークを行っていますが、 orrepeat(None)よりもはるかに高速であることを発見しました:while Truewhile 1

>>> def bench7():
...   foo = 0
...   a = time()
...   for i in repeat(None):
...     foo += 1
...     if foo == 100000000:
...       break
...   b = time()
...   print a, b, b-a
... 
>>> def bench8():
...   foo = 0
...   a = time()
...   while True:
...     foo += 1
...     if foo == 100000000:
...       break
...   b = time()
...   print a, b, b-a
... 
>>> bench7()
1326592924.41 1326592935.42 11.0051281452
>>> bench7()
1326592936.36 1326592947.48 11.1183578968
>>> bench8()
1326592951.47 1326592965.03 13.5640599728
>>> bench8()
1326592966.07 1326592979.6 13.5341670513`

このような while ループの使用法は、実際に while ループを使用した最後のものでした。私が見落としているwhileを使用する理由は残っていますか?

4

3 に答える 3

9

while Trueグローバル ルックアップが原因で、 は遅くなるだけですTrue。代わりに while ループを使用while 1すると、(少なくとも速度、美しさ、および明快さの点で) for-repeat を簡単に打ち負かすことができます。

>>> from dis import dis
>>> def f():
        while True:
            print

>>> dis(f)
  2           0 SETUP_LOOP              11 (to 14)
        >>    3 LOAD_GLOBAL              0 (True)
              6 POP_JUMP_IF_FALSE       13
  3           9 PRINT_NEWLINE       
             10 JUMP_ABSOLUTE            3
        >>   13 POP_BLOCK           
        >>   14 LOAD_CONST               0 (None)
             17 RETURN_VALUE        

>>> def g():
        while 1:
            print

>>> dis(g)
  2           0 SETUP_LOOP               4 (to 7)
  3     >>    3 PRINT_NEWLINE       
              4 JUMP_ABSOLUTE            3
        >>    7 LOAD_CONST               0 (None)
             10 RETURN_VALUE    

繰り返しの主な使用例は、定数値のストリームをimapまたはizipに提供することです。たとえば、次は 2 のべき乗の合計を計算します sum(imap(pow, repeat(2), xrange(10)))

繰り返しitertool を使用して、変数の変更を必要としない for ループを高速化することもできます。たとえば、Guido は次の手法を使用して、timeitモジュールのループ オーバーヘッドを最小限に抑えました。

他の質問に答えるには、「while ループを使用する理由はありますか」。答えはイエスです。Python の for ループは、イテレータを使用して値のストリームを生成する foreach です。対照的に、while ループは無制限 (while-True の例のように) か、特定の条件が満たされたときに終了します (たとえば、ユーザーが「quit」などを入力するまでユーザー入力をループします)。

while ループと for ループの対照的な機能は、while ループを for ループに簡単に置き換えることができないコラッツ予想の例で見ることができます。

def collatz(n):
    print n
    while n > 1:
        n = n // 2 if n % 2 == 0 else n * 3 + 1
        print n

Python の標準ライブラリを grep することで、while ループのさらに多くの例と使用例を見ることができます。

要約すると、while ステートメントはツールキットの重要な部分です :-)

于 2012-01-15T03:08:20.717 に答える
1

While ループにより、真偽値のテストが可能になります。

while x < y:

それが繰り返しより遅い理由である可能性はありますか?

于 2012-01-15T02:18:31.823 に答える
0

repeat(None)GLOBAL変数のルックアップをトリガーするため、より高速ですwhile Trueが、そうではありません。 より約14%高速です。while 1while TrueTruewhile 1repeat(None)

于 2012-01-15T09:38:23.510 に答える