調用一次 perf_counter(),從計算機系統裏隨機選一個時間點A,計算其距離當前時間點B1有多少秒。當第二次調用該函數時,默認從第一次調用的時間點A算起,距離當前時間點B2有多少秒。兩個函數取差,即實現從時間點B1到B2的計時功能。
import time scale = 50 print("執行開始".center(scale//2,"-")) # .center() 控制輸出的樣式,寬度爲 25//2,即 22,漢字居中,兩側填充 - start = time.perf_counter() # 調用一次 perf_counter(),從計算機系統裏隨機選一個時間點A,計算其距離當前時間點B1有多少秒。
#當第二次調用該函數時,默認從第一次調用的時間點A算起,距離當前時間點B2有多少秒。兩個函數取差,即實現從時間點B1到B2的計時功能。 for i in range(scale+1): a = '*' * i # i 個長度的 * 符號 b = '.' * (scale-i) # scale-i) 個長度的 . 符號。符號 * 和 . 總長度爲50 c = (i/scale)*100 # 顯示當前進度,百分之多少 dur = time.perf_counter() - start # 計時,計算進度條走到某一百分比的用時 print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='') # \r用來在每次輸出完成後,將光標移至行首,這樣保證進度條始終在同一行輸出,
#即在一行不斷刷新的效果;{:^3.0f},輸出格式爲居中,佔3位,小數點後0位,浮點型數,
#對應輸出的數爲c;{},對應輸出的數爲a;{},對應輸出的數爲b;{:.2f},輸出有兩位小數的浮點數,
#對應輸出的數爲dur;end='',用來保證不換行,不加這句默認換行。
time.sleep(0.1) # 在輸出下一個百分之幾的進度前,中止0.1秒
print("\n"+"執行結果".center(scale//2,'-'))
測試結果:python
這固然不止這一點用處小程序
好比你還能夠用在程序的性能測試上app
進行性能分析比對查找問題函數
————上例子:性能
前一陣子再作網略爬蟲,就拿這個最簡單例子來說解感受挺適合的。測試
儘管Requests庫功能很友好、開發簡單(其實除了import外只需一行主要代碼),但其性能與專業爬蟲相比仍是有必定差距的。請編寫一個小程序,「任意」找個url,測試一下成功爬取100次網頁的時間。(某些網站對於連續爬取頁面將採起屏蔽IP的策略,因此,要避開這類網站。)網站
在這裏咱們以百度爲url連接測試,代碼以下:url
first_test.pyspa
import time import requests def getHtml(url): try: r = requests.get(url) r.raise_for_status() r.encoding = r.apparent.encoding return url.text except: return("The requests get url found unkonw-mistakes.") def main(): url = "https://baidu.com" time1 = time.time() i = 0 while(i<100): start = time.time() getHtml(url) end = time.time() i += 1 print('第{}次爬取耗時{}s'.format(i+1,end-start)) time2 = time.time() print(time2-time1) if __name__ =='__main__': main()
運行結果:調試
如圖所示大約共耗時31.19s .
ok,讓咱們進行接下來的測試.........
second_test.py
import requests import time def getHTMLText_timecost(url): try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return 'ERRO' def main(): url = 'https://www.baidu.com' sumtime = 0 succtimes = 0 for i in range(100): start = time.time() res = getHTMLText_timecost(url) if res != 'ERRO': succtimes += 1 end = time.time() timecost = end - start sumtime += timecost print('第{}次爬取耗時{}s'.format(i+1,timecost)) print('共爬取{}次,耗時{}s,其中爬取成功{}次'.format(i+1,sumtime,succtimes)) if __name__ == '__main__': main()
運行結果:
如圖所示大約共耗時20.53s .
通過這兩段代碼的調試運行,咱們發現相同功能下不一樣代碼之間存在着性能的差別,並隨着運
算工做量的提高而愈發明顯這就須要咱們對代碼進行科學的分析與思考尋求更優的方案投入到實際應用中。