Python 程序運行時間計時

簡單性能分析

Written By Python高效編程

裝飾器實現:

@timer 就相當於 timer(waste_some_time) 的簡化版本。

裝飾器是一種將函數作為參數並進行包裝(加強函數功能)的“語法糖”,具有方便、易用、可複用的特點。

其中 wrapper 函數,是 timer 函數的內置函數,可以使用 timer 函數中的局部變量。也就是說,在 wrapper 函數內部,可以直接使用 timer 函數傳進來的參數 func。

wrapper(*args, **kwargs)、func(*args, **kwargs) 表示接受任何參數。如果括號中空白的話,傳進來的 func 如果有參數的話,Python 解釋器會報錯。

Python 程序運行時間計時

Python高效編程

 # 錯誤寫法
def do_twice(func):
def wrapper():
func()
func()
return wrapper

@do_twice
def waste_some_time(vol):
ulist = []
for i in range(vol):
ulist.append(i)
# TypeError: waste_some_time() missing 1 required positional argument: 'vol'

正確操作如下:

Python 程序運行時間計時

Python高效編程

 import functools
import time
## 裝飾器
def timer(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
begin_time = time.perf_counter()
value = func(*args, **kwargs)
end_time = time.perf_counter()
run_time = end_time - begin_time
print('{} 共用時:{} s'.format(func.__name__, run_time))
return value
return wrapper

@timer
def waste_some_time():
ulist = []
for i in range(1000):
ulist.append(i)
#輸出:waste_some_time 共用時:8.039700333029032e-05 s

ipython 與 jupyert notebook

魔法命令:%timeit waste_some_time()

輸出: 56.7 µs ± 204 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)


分享到:


相關文章: