1. 程式人生 > >裝飾器的應用

裝飾器的應用

http import bsp 但是 函數 問題 地址 生產環境 src

 需求1:需要大長臉寫一個功能,測試一下同事二狗的函數的執行效率
import time #引入time模塊
print(time.time())

技術分享圖片

def func1():
    time.sleep(1)
    print(來了,老弟)

def func2():
    time.sleep(1)
    print(回手 掏 ,走位走位....)
#
#
import time
start_time = time.time()
func1()
end_time = time.time()
print(此函數的執行時間是%s % (end_time-start_time))

import time start_time = time.time() func2() end_time = time.time() print(此函數的執行時間是%s % (end_time-start_time)) # 第一版本不好,重復造輪子,測試函數的效率 必須得復制代碼測試 改版:

技術分享圖片

# 第二版 將臉哥的代碼封裝到函數中,基本完成,
import time

def func1():
    time.sleep(0.6)
    print(來了,老弟)

def func2():
    time.sleep(0.5)
    print(回手 掏 ,走位走位....
) def timmer(f): start_time = time.time() f() end_time = time.time() print(此函數的執行時間是%s % (end_time-start_time)) timmer(func1) timmer(func2)

技術分享圖片

# 第三版  領導要求在生產環境測試函數的真正的執行效率:線上500個函數
# 線上問題:
    # 線上的函數你不改變
    # 函數的原本的調用方式不能改變
import time
def func1():
    time.sleep(0.6)
    print(來了,老弟
) def func2(): time.sleep(0.5) print(回手 掏 ,走位走位....) # 原本線上的調用方式: # func1() # func2() # 但是用了臉哥的測試效率的函數之後 def timmer(f): start_time = time.time() f() end_time = time.time() print(此函數的執行時間是%s % (end_time-start_time)) # 此時你已經改變了原函數的調用方式,並且程序執行了兩遍 func1() timmer(func1)

技術分享圖片

# 第四版:第三版 沒有改變函數裏面的函數體,但是改變了函數的調用方法,所以要解決:用最少的代碼,解決調用方式一致性的問題。
# 最終完成的需求 func1() 這個指令既要執行func1函數,又要測試效率
import time
def func1():
    time.sleep(0.6)
    print(來了,老弟)
#
# def func2():
#     time.sleep(0.5)
#     print(‘回手 掏 ,走位走位....‘)

def timmer(f): # f = func1 函數的內存地址
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print(此函數的執行時間是%s % (end_time-start_time))
    return inner
func1 = timmer(func1) # = inner
func1()  # inner()

技術分享圖片

# 第五版: 最終基礎版 python提供一個機制,優化,語法糖 @  上面還是不夠優化,我們引入第5種python語法糖@   示例:func1 = timmer(func1) 就等於@timmer
import time
def timmer(f):  # f = func1 函數的內存地址
    def inner():
        start_time = time.time()
        f()
        end_time = time.time()
        print(此函數的執行時間是%s % (end_time - start_time))

    return inner

@timmer # func1 = timmer(func1)
def func1():
    time.sleep(0.6)
    print(來了,老弟)

func1()  # inner()
@timmer
def func2():
    time.sleep(0.6)
    print(來le)
func2()

@timmer
def func3():
    time.sleep(0.6)
    print()
func3()

技術分享圖片

技術分享圖片

二、被裝飾函數帶參數

import time
def timmer(f):  # f = func1 函數的內存地址
    def inner(*args, **kwargs):
        start_time = time.time()
        f(*args, **kwargs)
        end_time = time.time()
        print(此函數的執行時間是%s % (end_time - start_time))

    return inner
@timmer  # func1 = timmer(func1)
def func1(a):
    time.sleep(0.6)
    print(來了,%s % (a))
func1(alex)

技術分享圖片

裝飾器的應用