簡單性能分析
Written By Python高效編程
裝飾器實(shí)現(xiàn):
@timer 就相當(dāng)于 timer(waste_some_time) 的簡化版本。
裝飾器是一種將函數(shù)作為參數(shù)并進(jìn)行包裝(加強(qiáng)函數(shù)功能)的“語法糖”,具有方便、易用、可復(fù)用的特點(diǎn)。
其中 wrapper 函數(shù),是 timer 函數(shù)的內(nèi)置函數(shù),可以使用 timer 函數(shù)中的局部變量。也就是說,在 wrapper 函數(shù)內(nèi)部,可以直接使用 timer 函數(shù)傳進(jìn)來的參數(shù) func。
wrapper(*args, **kwargs)、func(*args, **kwargs) 表示接受任何參數(shù)。如果括號中空白的話,傳進(jìn)來的 func 如果有參數(shù)的話,Python 解釋器會報(bào)錯(cuò)。
# 錯(cuò)誤寫法
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高效編程
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('{} 共用時(shí):{} 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 共用時(shí):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)
https://blog.csdn.net/weixin_43773093/article/details/87824347