運転時間を計算するtimeit
3633 ワード
timeitの機能と使い方 timeit
モジュールは、コードの実行時間をテストする機能を提供します.オブジェクトへのアクセス速度の向上を定義__slots__
でテストする記事がありますが、ここを参照してください.公式文書には、次のような使用例があります.#
python -m timeit '"-".join([str(n) for n in range(100)])'
# REPL
>>> import timeit
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
timeit
を使用する場合は、定義されたtimeit.timeit
,timeit.repeat
,timeit.default_timer
メソッド、またはクラスtimeit.Timer
を定義し、独自のメソッドを使用することができます.# API
timeit.timeit(stmt='pass', setup='pass', timer=, number=1000000)
timeit.repeat(stmt='pass', setup='pass', timer=, repeat=3, number=1000000)
class timeit.Timer(stmt='pass', setup='pass', timer=)¶
#
python -m timeit '"-".join([str(n) for n in range(100)])'
# REPL
>>> import timeit
>>> timeit.timeit('"-".join([str(n) for n in range(100)])', number=10000)
0.7288308143615723
# API
timeit.timeit(stmt='pass', setup='pass', timer=, number=1000000)
timeit.repeat(stmt='pass', setup='pass', timer=, repeat=3, number=1000000)
class timeit.Timer(stmt='pass', setup='pass', timer=)¶
timeit()
受け入れられた最初のパラメータstmtは時間を計算する式であり、2番目のパラメータsetupは初期化された式である.timeit.repeat()
のrepeatパラメータは、number回を呼び出すtimeit()に相当し、numberはデフォルトで3回の実行時間のリストを返し、通常はmin()を取ってプログラムの実行時間を評価することができる.timeit.repeat()
のうち、最小値を除いては、システム内の他のプログラムの影響による#
>>> import timeit
>>> attribute is missing
>>> s = """\\
... try:
... str.__nonzero__
... except AttributeError:
... pass
... """
>>> timeit.timeit(stmt=s, number=100000)
0.9138244460009446
#
def test():
"""Stupid test function"""
L = []
for i in range(100):
L.append(i)
if __name__ == '__main__':
import timeit
print(timeit.timeit("test()", setup="from __main__ import test"))
その他
私がインターネットでtimeit関連リソースを閲覧したとき、この文章を見た.コンテキストマネージャ(context manager)によってタイマーを実現し、変数のライフサイクル関連特性(#TODO)を利用した.著者が言ったように、サイクル数などの他の特性を加え、より優雅なタイマーを実現することができるが、コードは以下のように参考になる.# Source code: https://gist.github.com/pengmeng/78a25663c20ab8890b81
__author__ = 'mengpeng'
import time
class timeme(object):
__unitfactor = {'s': 1,
'ms': 1000,
'us': 1000000}
def __init__(self, unit='s', precision=4):
self.start = None
self.end = None
self.total = 0
self.unit = unit
self.precision = precision
def __enter__(self):
if self.unit not in timeme.__unitfactor:
raise KeyError('Unsupported time unit.')
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
self.total = (self.end - self.start) * timeme.__unitfactor[self.unit]
self.total = round(self.total, self.precision)
def __str__(self):
return 'Running time is {0}{1}'.format(self.total, self.unit)
実行例:from timeme import timeme
with timeme('ms', 6) as t:
result = sum(range(100000))
print(t) # Running time is 5.2948ms
print(t.total) # 5.2948
参考資料
# Source code: https://gist.github.com/pengmeng/78a25663c20ab8890b81
__author__ = 'mengpeng'
import time
class timeme(object):
__unitfactor = {'s': 1,
'ms': 1000,
'us': 1000000}
def __init__(self, unit='s', precision=4):
self.start = None
self.end = None
self.total = 0
self.unit = unit
self.precision = precision
def __enter__(self):
if self.unit not in timeme.__unitfactor:
raise KeyError('Unsupported time unit.')
self.start = time.time()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
self.total = (self.end - self.start) * timeme.__unitfactor[self.unit]
self.total = round(self.total, self.precision)
def __str__(self):
return 'Running time is {0}{1}'.format(self.total, self.unit)
from timeme import timeme
with timeme('ms', 6) as t:
result = sum(range(100000))
print(t) # Running time is 5.2948ms
print(t.total) # 5.2948