Python|统计函数执行时间的优雅用法


当应用规模大到一定程度,我们会开始关心,整体的响应时间,而整体的响应时间又是由单个函数的执行时间决定的,怎样统计函数执行时间呢?
很简单,开始的时候记录一次时间,结束的时候记录一次时间,两个时间相减,得到的就是函数执行时间,例子如下:

import time
def fun_run_time():
    time_start = time.time()
    print('sleep 3 start')
    time.sleep(3)
    print('sleep 3 end')
    time_end = time.time()
    print(f'fun_run_time use {(time_end - time_start):.2f} secends')

if __name__ == "__main__":
    fun_run_time()

执行这段代码,得到运行结果:

sleep 3 start
sleep 3 end
fun_run_time use 3.00 secends

time.sleep(3)就是我们正常的函数代码部分.至此,统计函数执行时间的目的是达到了,怎么优雅呢?
这里就要用到装饰器这个神奇的东西了.所谓装饰器就是在代码运行期间动态增加功能,英文名:Decorator

改进后的代码是这样的:

import time
import functools

def fun_run_time(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        time_start = time.time()
        res = func(*args, **kw)
        time_end = time.time()
        print(f'{func.__name__} use {(time_end - time_start):.2f} secends')
        return res
    return wrapper

@fun_run_time
def long_time_fun():
    print('sleep 3 start')
    time.sleep(3)
    print('sleep 3 end')
if __name__ == "__main__":
    long_time_fun()

执行结果:

sleep 3 start
sleep 3 end
long_time_fun use 3.00 secends

没错,执行结果是一样的,以后,如果想知道哪个函数的执行时间,直接在它的上面写上

@fun_run_time

就可以了.
装饰器的原理,网上搜索吧,装饰器的好处就是:在不修改原有函数的情况下,达到了统计原有函数使用时间的目的.


相关博文

About rainbird

IOS攻城狮
This entry was posted in Python and tagged , , , , , , . Bookmark the permalink.

发表评论