私が望むのは、コードのどこかで時間のカウントを開始してから、経過した時間を取得して、いくつかの関数を実行するのにかかった時間を測定することです。timeit モジュールを間違って使用していると思いますが、ドキュメントは私にとって混乱を招くだけです。
import timeit
start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)
私が望むのは、コードのどこかで時間のカウントを開始してから、経過した時間を取得して、いくつかの関数を実行するのにかかった時間を測定することです。timeit モジュールを間違って使用していると思いますが、ドキュメントは私にとって混乱を招くだけです。
import timeit
start = timeit.timeit()
print("hello")
end = timeit.timeit()
print(end - start)
2 点間の経過時間を測定したいだけの場合は、次のように使用できます time.time()
。
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
これにより、実行時間が秒単位で示されます。
3.3以降の別のオプションは、要件に応じてperf_counter
またはを使用することです。process_time
3.3 より前では使用が推奨されていました( Ambertime.clock
に感謝します)。ただし、現在は推奨されていません。
Unix では、現在のプロセッサ時間を秒単位の浮動小数点数として返します。精度、そして実際には「プロセッサ時間」の意味の定義そのものは、同じ名前の C 関数の精度に依存します。
Windows では、この関数は、Win32 関数に基づいて、この関数を最初に呼び出してから経過した壁時計の秒数を浮動小数点数として返します
QueryPerformanceCounter()
。通常、分解能は 1 マイクロ秒よりも優れています。バージョン 3.3 以降非推奨: この関数の動作はプラットフォームに依存します:明確に定義された動作を行うには、要件に応じてorを代わりに使用してください。
perf_counter()
process_time()
timeit.default_timer
の代わりに使用しtimeit.timeit
ます。前者は、使用しているプラットフォームとバージョンの Python で利用可能な最適なクロックを自動的に提供します。
from timeit import default_timer as timer
start = timer()
# ...
end = timer()
print(end - start) # Time in seconds, e.g. 5.38091952400282
timeit.default_timerは、OS に応じて time.time() または time.clock() に割り当てられます。Python 3.3 以降では、 default_timerはすべてのプラットフォームでtime.perf_counter()です。Python - time.clock() と time.time() - 精度を参照してください。
以下も参照してください。
時間を計りたい機能を考えると、
test.py:
def foo():
# print "hello"
return "hello"
最も簡単な使用方法timeit
は、コマンド ラインから呼び出すことです。
% python -mtimeit -s'import test' 'test.foo()'
1000000 loops, best of 3: 0.254 usec per loop
関数の速度を比較するためにtime.time
orを (素朴に)使用しようとしないでください。誤解を招く結果になる可能性があります。time.clock
PS。時間を計測したい関数に print ステートメントを入れないでください。そうしないと、測定される時間は端末の速度に依存します。
操作の所要時間を計算する最も簡単な方法:
import time
start_time = time.monotonic()
<operations, programs>
print('seconds: ', time.monotonic() - start_time)
公式ドキュメントはこちら。
実行の測定に使用time.time
すると、コンピューター上の他のプロセスによって費やされた実行時間を含む、コマンドの全体的な実行時間が得られます。これはユーザーが気付く時間ですが、異なるコードスニペット/アルゴリズム/関数/..を比較したい場合は良くありません。
詳細情報timeit
:
プロファイリングについてより深い洞察が必要な場合:
更新:昨年、http://pythonhosted.org/line_profiler/を頻繁に使用しましたが、非常に役立ち、Pythonプロファイルモジュールの代わりに使用することをお勧めします。
タイミング コードの別のコンテキスト マネージャーを次に示します。
使用法:
from benchmark import benchmark
with benchmark("Test 1+1"):
1+1
=>
Test 1+1 : 1.41e-06 seconds
または、時間値が必要な場合
with benchmark("Test 1+1") as b:
1+1
print(b.time)
=>
Test 1+1 : 7.05e-07 seconds
7.05233786763e-07
ベンチマーク.py :
from timeit import default_timer as timer
class benchmark(object):
def __init__(self, msg, fmt="%0.3g"):
self.msg = msg
self.fmt = fmt
def __enter__(self):
self.start = timer()
return self
def __exit__(self, *args):
t = timer() - self.start
print(("%s : " + self.fmt + " seconds") % (self.msg, t))
self.time = t
http://dabeaz.blogspot.fr/2010/02/context-manager-for-timing-benchmarks.htmlから適応
「hh:mm:ss」文字列を返す小さなタイマー クラスを次に示します。
class Timer:
def __init__(self):
self.start = time.time()
def restart(self):
self.start = time.time()
def get_time_hhmmss(self):
end = time.time()
m, s = divmod(end - self.start, 60)
h, m = divmod(m, 60)
time_str = "%02d:%02d:%02d" % (h, m, s)
return time_str
使用法:
# Start timer
my_timer = Timer()
# ... do something
# Get time string:
time_hhmmss = my_timer.get_time_hhmmss()
print("Time elapsed: %s" % time_hhmmss )
# ... use the timer again
my_timer.restart()
# ... do something
# Get time:
time_hhmmss = my_timer.get_time_hhmmss()
# ... etc
プロファイラー モジュールを使用します。非常に詳細なプロファイルを提供します。
import profile
profile.run('main()')
それは次のようなものを出力します:
5 function calls in 0.047 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 :0(exec)
1 0.047 0.047 0.047 0.047 :0(setprofile)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.047 0.047 profile:0(main())
1 0.000 0.000 0.000 0.000 two_sum.py:2(twoSum)
とても参考になりました。
(Ipython のみ) %timeitを使用して平均処理時間を測定できます。
def foo():
print "hello"
その後:
%timeit foo()
結果は次のようになります。
10000 loops, best of 3: 27 µs per loop
python3:
from time import sleep, perf_counter as pc
t0 = pc()
sleep(1)
print(pc()-t0)
エレガントで短い。
このためのライブラリを作成しました。関数を測定したい場合は、このようにするだけです
from pythonbenchmark import compare, measure
import time
a,b,c,d,e = 10,10,10,10,10
something = [a,b,c,d,e]
@measure
def myFunction(something):
time.sleep(0.4)
@measure
def myOptimizedFunction(something):
time.sleep(0.2)
myFunction(input)
myOptimizedFunction(input)
ラムダとして、経過時間とタイム スタンプを取得します。
import datetime
t_set = lambda: datetime.datetime.now().astimezone().replace(microsecond=0)
t_diff = lambda t: str(t_set() - t)
t_stamp = lambda t=None: str(t) if t else str(t_set())
実際には:
>>>
>>> t_set()
datetime.datetime(2021, 3, 21, 1, 25, 17, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=61200), 'PDT'))
>>> t = t_set()
>>> t_diff(t)
'0:00:14'
>>> t_diff(t)
'0:00:23'
>>> t_stamp()
'2021-03-21 01:25:57-07:00'
>>> t_stamp(t)
'2021-03-21 01:25:22-07:00'
>>>
時間は、次のように %timeit マジック関数で測定することもできます。
%timeit -t -n 1 print("hello")
n 1
機能を1回だけ実行するためのものです。