私はただコードの時間を計ろうとしています。擬似コードは次のようになります。
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
これはPythonでどのように見えますか?
より具体的には、真夜中からのティック数を取得するにはどうすればよいですか(またはPythonそのタイミングを整理します)?
time
モジュールには、time
とclock
の2つのタイミング関数があります。 time
は、これがあなたの関心事である場合、「壁」時間を与えます。
ただし、python docs は、clock
をベンチマークに使用する必要があることを示しています。clock
は異なるシステムで異なる動作をすることに注意してください。
clock
を初めて呼び出したときにカウントを開始します)。#ms windows t0 = time.clock() do_something() t = time.clock()-t0#tは経過した秒数です(フローティングポイント)
clock
はCPU時間を報告します。現在、これは異なり、おそらくあなたのプログラムがCPU時間を要求する唯一のプロセスではないので(おそらく他のプロセスがなくても、カーネルはCPU時間を時々使用します)、必要な値です。したがって、この時間は、通常、ウォール時間(つまりtime.time()-t0)よりも小さい¹であり、コードのベンチマークを行う場合に意味があります。#linux t0 = time.clock() do_something() t = time.clock()-t0#tはCPU秒経過(浮動小数点) )
それとは別に、 timeit モジュールにはTimer
クラスがあり、利用可能な機能からのベンチマークに最適なものを使用することになっています。
¹スレッドが邪魔にならない限り...
²Python≥3.3: time.perf_counter()
およびtime.process_time()
..perf_counter
はtimeit
モジュールによって使用されています。
必要なのは、time
モジュールのtime()
関数です:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
ただし、他のオプションについては timeit モジュールを使用できます。
最近使用したソリューションは次のとおりです。
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
このように使用します(少なくともPython 2.5)が必要です):
with Timer():
do_long_code()
コードが終了すると、タイマーは実行時間を自動的に出力します。甘い! Python Interpreterで何かをすばやくベンチしようとする場合、これが最も簡単な方法です。
「now」と「format_delta」のサンプル実装を次に示しますが、お好みのタイミングとフォーマット方法を自由に使用してください。
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
好みのフォーマット方法がある場合、またはこれらすべてを行う簡単な方法がある場合はお知らせください!
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
深夜から:
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
time module in pythonを使用すると、clock()関数にアクセスできます。この関数は、秒単位の時間を浮動小数点として返します。
システムによって内部クロックの設定(1秒あたりのティック)に基づいて精度が異なりますが、通常は少なくとも20ミリ秒未満であり、場合によっては数マイクロ秒よりも優れています。
-アダム
時間を計りたいステートメントが多数ある場合は、次のようなものを使用できます。
_class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
_
次に、コードは次のようになります。
_tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
_
そうすれば、各ブロックの前にt = time()
を、その後に1000 * (time() - t)
を入力する必要はありませんが、書式設定を制御し続けます(ただし、Ticket
に簡単に入れることができます)も))。
最小限のゲインですが、便利だと思います。