私はちょうどコードの時間を計ろうとしています。疑似コードは次のようになります。
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
これは Python ではどのように見えますか?
より具体的には、真夜中以降のティック数を取得するにはどうすればよいですか (または、Python がそのタイミングを整理します)。
モジュールには、time
2つのタイミング関数があります:time
とclock
。time
これがあなたが気にかけているものであるならば、あなたに「壁」時間を与えます。
ただし、Pythonのドキュメントにはclock
、ベンチマークに使用する必要があると記載されています。clock
別々のシステムでは動作が異なることに注意してください。
clock
します)。#msウィンドウ 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
、利用可能な機能からベンチマークに最適なものを使用することになっているクラスがあります。
¹糸が邪魔にならない限り…</p>
²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()
コードが終了すると、Timer は実行時間を自動的に出力します。甘い!Python インタープリターで何かをすばやくベンチに入れようとしている場合、これが最も簡単な方法です。
そして、これは「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
午前 0 時から:
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
Pythonのtime モジュールは、浮動小数点として秒単位の時間を返す 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
ます)。
最小限のゲインですが、便利だと思います。