進度條加載與案例優化對比——python使用perf_count方法實現

 

  本章咱們將討論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,'-'))

 

測試結果:python

這固然不止這一點用處小程序

好比你還能夠用在程序的性能測試上app

進行性能分析比對查找問題函數

————上例子性能

 

Requests庫的爬取性能分析

  前一陣子再作網略爬蟲,就拿這個最簡單例子來說解感受挺適合的。測試

  儘管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 .

 

   通過這兩段代碼的調試運行,咱們發現相同功能下不一樣代碼之間存在着性能的差別,並隨着

算工做量的提高而愈發明顯這就須要咱們對代碼進行科學的分析與思考尋求更優的方案投入到實際應用中。

相關文章
相關標籤/搜索