3

私はPythonが初めてです。それは私の最初の通訳言語です。今までJavaを勉強していました。そのため、Java プログラムを初めて実行するときは、次回よりも実行速度が遅くなります。レアシはキャッシングです。

import time

def procedure():
    time.sleep(2.5)

# measure process time
t0 = time.clock()
procedure()
print (time.clock() - t0), "seconds process time"

これを数回試しました。結果は常に等しくなります。それで、キャッシュが干渉せず、ベンチマークがかなり信頼できるというのは正しいですか?

4

1 に答える 1

5

このようなベンチマークを実行しても問題ありません。例のように、「長く」実行され、かなり一定で実行される関数の精度は十分です。ただし、いくつかの落とし穴があります。「クイック」関数(空の関数など)の場合、精度の限界に遭遇します。また、実行時間が異なる関数(たとえば、net i / oなど)の場合、最小/最大/平均ランタイムを見つけるために複数回測定する必要があります。それに加えて、最適に使用される時計はプラットフォームによって異なります。Windowsではtime.clock()が、* nixではtime.time()が優先されます。

幸いなことに、すべてを処理するモジュールがありますtimeit::

>>> import time
>>> def procedure():
    pass

>>> def time_this(f):
    t0=time.clock()
    f()
    print((time.clock() - t0), "seconds process time")


>>> time_this(procedure)
1.9555558310457855e-06 seconds process time
>>> time_this(procedure)
1.9555557742023666e-06 seconds process time
>>> time_this(procedure)
1.9555557742023666e-06 seconds process time
>>> import timeit
>>> timeit.Timer(procedure).timeit()
0.09460783423588737
>>> timeit.Timer(procedure).repeat()
[0.09791419021132697, 0.09721947901198291, 0.09598943441130814]

あなたはそれのソースを見たいかもしれません。または単にそれを使用してください;)

キャッシュに関して:Pythonコードは、最初に使用されたときにバイトコードにコンパイルされます。このバイトコードはデフォルトでキャッシュされますが、関数でsを実行しない限り、これはベンチマークに影響しませんimport

于 2012-09-27T10:54:03.487 に答える