進度條加載與案例優化對比——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,'-'))

 

測試結果:

這當然不止這一點用處

比如你還可以用在程序的性能測試上

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

————上例子

 

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 .

 

   經過這兩段代碼的調試運行,我們發現相同功能下不同代碼之間存在着性能的差異,並隨着

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM