1

私はすぐに ipython で 2 つの関数の時間を計ろうとしm1()m2()2 つの異なる実装で同じタスクを実行しました。

In [23]: %timeit for x in range(100): m1(a)
10000 loops, best of 3: 57.6 us per loop

In [24]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop

結果: 最初の実装はほぼ 2 倍高速です。ここまでは順調ですね。

好奇心から、for上記のループの範囲を変更しましたが、出力の意味がわかりません。

In [25]: %timeit for x in range(1): m2(a)
1000000 loops, best of 3: 1.29 us per loop

In [26]: %timeit for x in range(10): m2(a)
100000 loops, best of 3: 10.8 us per loop

In [27]: %timeit for x in range(1000): m2(a)
1000 loops, best of 3: 1.06 ms per loop

ここで for ループは正確に何をしているのでしょうか? また、範囲の値を大きくするとループ回数の値が減少するのはなぜですか?

PS:これを参考にしていました。また、私の質問を正確に伝えていない場合は、タイトルをより適切なものに編集してください。

4

2 に答える 2

2

timeitブロック全体の実行時間をカウントしています。

したがって、あなたが見ているのは次のとおりです。

  • 実行するm2(a)のに 1 回かかります1.29 us
  • m2(a)10回実行するには時間がかかります10.8 us
  • m2(a)1000回実行するには時間がかかります1.06 ms

1.06ms = 1060 usこれは、ベースラインの約 1000 倍 (10.8 us はベースラインの約 10 倍)であるため、ある程度の意味があります。

ループの回数に関しては、timeit は妥当な時間内に実行することを目指しています。

$ python -mtimeit -h
...
If -n is not given, a suitable number of loops is calculated by trying
successive powers of 10 until the total time is at least 0.2 seconds.
于 2013-10-20T04:04:13.343 に答える
1

@Nirkの回答のおかげで、何が起こっているのかがようやくわかりました。

In [26]: %timeit for x in range(100): m2(a)
10000 loops, best of 3: 108 us per loop

ここ、

%timeit=> ipython マジックコール

for x in range(100): m2(a)=> 実行中のステートメント。範囲値に基づいて、実行ごとに実行時間が増減します

10000 loops0.2=>合計時間の最小値の timeit モジュールの制約に基づいて、timeit が暗黙的に実行するループの最小数

best of 3: 108 us per loop=> timeit で実行されたベスト 3 ループの平均所要時間。

各実行の時間がベスト 3 の平均と同じであると仮定すると、各実行の時間 = 108 us

必要な最小ループ数 = 10^x、ここで x は条件を満たす最小の正の整数です。1.08 * (10^-4) * (10^x) > 2 * (10^-1)

つまり、(10^x) > 1.85 * (10^3)=>となる最小の xx = 4

したがって、必要な最小ループ数 = 10^x = 10000 loops.

于 2013-10-20T06:20:23.497 に答える