日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python计时器代码_Python功能点实现:函数级/代码块级计时器

發(fā)布時間:2024/1/1 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python计时器代码_Python功能点实现:函数级/代码块级计时器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

工程中我們常常需要對某一個函數(shù)或者一塊代碼計時,從而監(jiān)測系統(tǒng)關(guān)鍵位置的性能。計時方法是在代碼塊前后分別記錄當(dāng)前系統(tǒng)時間,然后兩者相減得到代碼塊的耗時。最簡單原始的實現(xiàn)類似:

from datetime import datetime

start = datetime.now()

# some code you want to measure

end = datetime.now()

print("Processing time for {} is: {} seconds".format('You Name It', elapse))

這種方式缺點明顯:假如系統(tǒng)內(nèi)有很多地方都需要計時,那么每個地方都需要插入這樣的計時代碼,首先是重復(fù)性工作很麻煩,其次這樣會降低代碼的可讀性,干擾對業(yè)務(wù)邏輯的理解。本文將給出一些更好的實現(xiàn),主要涉及的技術(shù)是裝飾器(Decorator)和運行時上下文(runtime context)。

基于裝飾器的函數(shù)級計時器

第一種計時器是比較常見的函數(shù)級計時器,通過裝飾器完成,將原函數(shù)改裝成擁有計時功能的新函數(shù),使其可以完成運行原來函數(shù)和計時兩件事。在使用時,只用在需要計時功能的函數(shù)代碼前加上類似@timer的語法糖,這樣每次調(diào)用原函數(shù)時,運行的將會是新函數(shù)。這樣就大大減少了重復(fù)性勞動。

具體實現(xiàn)如下:

from datetime import datetime

def timer(func):

'''Function Level Timer via Decorator'''

def timed(*args, **kwargs):

start = datetime.now()

result = func(*args, **kwargs)

end = datetime.now()

elapse = (end - start).total_seconds()

print("Processing time for {} is: {} seconds".format(func.__name__, elapse))

return result

return timed

@timer

def test_1(a):

'''Function Level'''

a *= 2

return a

if __name__ == '__main__':

print(test_1(1))

基于上下文的代碼塊級計時器

裝飾器實現(xiàn)的計時器可以為函數(shù)添加計時功能,可以滿足大部分情況的需要,但是假如我們想要更靈活一些,對任意一段連續(xù)的代碼塊做計時,怎樣做?使用原始的插計時代碼的方法顯然不是我們想要的;也可以將代碼塊重構(gòu)成一個函數(shù),再在上面加裝飾器,然而這就顯得不夠優(yōu)雅。因此我做出了下面的實現(xiàn)。

首先了解上下文管理的概念。大致是說Python中允許創(chuàng)建一種叫上下文管理器(Context Manager)的對象,它可以管理一個代碼塊執(zhí)行時的上下文信息。具體的方法是創(chuàng)建一個類,并為其實現(xiàn)object.__enter__和object.__exit__方法,前者在進(jìn)入代碼塊時自動執(zhí)行,后者在完成代碼塊執(zhí)行時自動執(zhí)行。

在使用時,通過with和as關(guān)鍵字,將__enter__的返回值綁定到某一個變量名,這個返回值里可以儲存代碼塊運行過程中得到的一些信息,在這里就是運行時間啦。具體的實現(xiàn)是創(chuàng)建一個計時器類Timer,在enter時記錄代碼塊運行的開始時間,exit時記錄完成時間、計算并儲存耗時到Timer實例中。在使用時,將with Timer() as t加到要計時的代碼塊前面,t.elapse中將會儲存代碼塊耗時,可以任意使用。

在這個基礎(chǔ)上,我們還可以做出一個裝飾器timer_來實現(xiàn)基于上下文的函數(shù)級計時器。

具體實現(xiàn)如下:

class Timer(object):

'''Code Block Level Timer via Context'''

def __enter__(self):

self.start = datetime.now()

return self

def __exit__(self, *args):

self.end = datetime.now()

self.elapse = (self.end - self.start).total_seconds()

def timer_(func):

'''Function Level Timer via Context & with Statement'''

def timed(*args, **kw):

with Timer() as t:

result = func(*args, **kw)

print("Processing time for {} is: {} seconds".format(func.__name__, t.elapse))

return result

return timed

def test_2(a):

'''Code Block Level'''

with Timer() as t:

a *= 2

print("Processing time for {} is: {} seconds".format('You Name It', t.elapse))

return a

@timer_

def test_3(a):

'''Function Level'''

a *= 2

return a

if __name__ == '__main__':

print(test_2(2))

print(test_3(3))

更靈活的實現(xiàn)

更優(yōu)雅地,我們還可以使用contextlib自帶的ContextDecorator,參考官方示例,做出既可以with又可以作為裝飾器的計時器timer_elegant:

from datetime import datetime

from contextlib import ContextDecorator

class timer_elegant(ContextDecorator):

'''Elegant Timer via ContextDecorator'''

def __init__(self, name):

self.name = name

def __enter__(self):

self.start = datetime.now()

def __exit__(self, *args):

self.end = datetime.now()

self.elapse = (self.end - self.start).total_seconds()

print("Processing time for {} is: {} seconds".format(self.name, self.elapse))

@timer_elegant('test_4')

def test_4(a):

a *= 2

return a

def test_5(a):

a *= 2

return a

if __name__ == '__main__':

print(test_4(4))

with timer_elegant('test 5'):

result_5 = test_5(5)

print(result_5)

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

總結(jié)

以上是生活随笔為你收集整理的python计时器代码_Python功能点实现:函数级/代码块级计时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。