計算執行時間工具timeit

2022-08-05 11:06:18 字數 2507 閱讀 3605

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=)¶

接下來看一些複雜點的示例

# 多行表示式的呼叫

>>> 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):

if __name__ == '__main__':

import timeit

print(timeit.timeit("test()", setup="from __main__ import test"))

當我在網上瀏覽timeit相關資源時看到了這篇文章, 上面提到了通過上下文管理器(context manager)實現一個計時器,利用了變數的生命週期相關特性(#todo),雖然就像作者所說,可以加上其它的特性比如迴圈次數等以及更優雅的實現一個計時器,**如下,可供參考:

# source code: 

__author__ = 'mengpeng'

import time

class timeme(object):

__unitfactor =

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 '.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