本章我們將討論python3 perf_counter()的用法及它的實際應用我從中選取兩個python基於rquests庫的爬蟲實例代碼源文件進行舉例
Python3 perf_counter() 用法:
調用一次 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,'-'))
測試結果:

這當然不止這一點用處
比如你還可以用在程序的性能測試上
進行性能分析比對查找問題
————上例子:
Requests庫的爬取性能分析
前一陣子再做網略爬蟲,就拿這個最簡單例子來講解感覺挺適合的。
盡管Requests庫功能很友好、開發簡單(其實除了import外只需一行主要代碼),但其性能與專業爬蟲相比還是有一定差距的。請編寫一個小程序,“任意”找個url,測試一下成功爬取100次網頁的時間。(某些網站對於連續爬取頁面將采取屏蔽IP的策略,所以,要避開這類網站。)
在這里我們以百度為url鏈接測試,代碼如下:
first_test.py
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 .
經過這兩段代碼的調試運行,我們發現相同功能下不同代碼之間存在着性能的差異,並隨着運
算工作量的提升而愈發明顯這就需要我們對代碼進行科學的分析與思考尋求更優的方案投入到實際應用中。
