運転時間を計算する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=
  • timeit()受け入れられた最初のパラメータstmtは時間を計算する式であり、2番目のパラメータsetupは初期化された式である.
  • timerパラメータはタイマーであり、プラットフォームによってデフォルトが異なります.ここを参照してください.ただし、UnixでもWindowsでも測定された時間はシステムが経過した時間なので、実行中の他のプログラムに影響される可能性があります.
  • numberパラメータは式の実行回数であるため、ここで返される時間は1000000回の合計を実行する時間である.
  • timeit.repeat()のrepeatパラメータは、number回を呼び出すtimeit()に相当し、numberはデフォルトで3回の実行時間のリストを返し、通常はmin()を取ってプログラムの実行時間を評価することができる.
  • timeit.repeat()のうち、最小値を除いては、システム内の他のプログラムの影響による
  • の可能性があるため、参照すべき意味は大きくないかもしれません.
  • pythonバージョンの違いによるインタフェースパラメータの違いに注意し、ここではpython 2がデフォルトで採用する.7バージョン
  • 次に複雑な点の例を見てみましょう
    #  
    >>> 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
    

    参考資料

  • https://docs.python.org/2.7/library/timeit.html
  • http://www.jianshu.com/p/8cb73791f16c