1

シングル コア 1.4 GHz コンピューターで、次の 2 つの timeit コードを実行しました。

suzan:~$ python -mtimeit "
def count(n):
    while n > 0:
        n -= 1
count(10000000)
"
10 loops, best of 3: 1.73 sec per loop
suzan:~$
suzan:~$ python -mtimeit "
import os       
def count(n):
    while n > 0:
        n -= 1
count(10000000)
"
10 loops, best of 3: 1.18 sec per loop
suzan:~$ 

2 番目の timeit コマンドは、「import os」という余分なコード行が 1 行含まれている場合でも、最初のコマンドよりも短い時間を示します。これは異常な動作ですか、それとも予想される動作ですか?

どんな助けでも大歓迎です。

4

2 に答える 2

1

私が考えることができる唯一の理由は、そのような動作を説明することができますが、実際には重要ではありません。L1キャッシュラインが欠落しており、データキャッシュを参照しています(Python VMバイトコードはプロセッサの実行可能コードではありません)。関数のコードはcount別のコードオブジェクトとして保存され、その開始アドレスや速度はセットアップコードの影響を受けません。これは非常に不規則な動作です。

あなたのプロセッサは何を作っていますか?あなたのPythonバージョン?あなたのOSバージョン?そして、テスト結果は再現可能ですか?

于 2010-10-17T19:32:48.470 に答える
1

両方のスニペットで効果的に(0.4%以内に)同時に取得します。Python は os モジュールを通常のインポートの一部としてインポートします

>>> import sys
>>> "os" in sys.modules
True
>>> 

そのため、「import os」を含むコードの 2 番目のビットは、ディスクにヒットしていません。それが行うのは、sys.modules に対するチェックだけです。

import builtinsが同じ反応を示すかどうかを確認できますが、表示される内容を説明するのは本当に途方に暮れています. Python を起動するときに「-v」オプションを有効にして、Python が何をしているかについてもう少し診断し、結果を比較することができます。それらは同一である必要があります。

于 2010-09-18T19:22:35.510 に答える