python 代碼檢查,實現行級代碼最佳化

來源:互聯網
上載者:User

標籤:程式   主題   touch   python   

    有時候運行一個python程式,它需要運行很長時間。你或許想提升該程式的運行效率。那該怎麼做那?

     首先需要你要找到該程式瓶頸在哪裡~   比如,哪個函數的運行花費時間比較長? 哪個函數佔用記憶體比較多,是否需要最佳化對記憶體的使用? 哪個佔用cpu時間比較長? 等...   這些都需要考慮,python有幾個庫可以協助你解決這些問題~   廢話不多說,切入主題。


首先寫一段讀取一個檔案的python指令碼:

touch c9.py#!/usr/bin/env python#Date: 2015/07/21def read_file(fpath):    BLOCK_SIZE=1024    with open(fpath, ‘rb‘) as fd:        block = fd.read(BLOCK_SIZE)        if block:            yield block        else:            returndef main():    for i in read_file(‘~/access.log‘)        print iif __name__ == "__main__":    main()

 然後,對該代碼進行測試。


首先測試該代碼已耗用時間:

      它是一個外部的python測量。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6F/EE/wKiom1Wtq0WjGaA4AAEVu-Nf1Sc199.jpg" title="1.png" alt="wKiom1Wtq0WjGaA4AAEVu-Nf1Sc199.jpg" />


real 表明了執行指令碼花費的總時間。

user 表明了執行指令碼花費在cpu的時間。

sys 表明了執行指令碼花費在核心功能的時間。

因此, Real time和user+sys相加的不同或許表明了時間花費在等待i/o或者是系統在忙於執行其他任務。


使用cProfile模組

        如果想知道花費在每個函數和方法上的時間,以及他們被調用了多少次,你可以使用cProfile模組。

$ python -m cProfile -s cumulative  + 要執行的python指令碼    ( -s cumulative 它將通過累積花費在每個函數上的時間來排序)


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6F/EF/wKiom1Wtr_7SVO0dAAQLcFGOoa8346.jpg" title="3.png" alt="wKiom1Wtr_7SVO0dAAQLcFGOoa8346.jpg" />    

你將看到花費在運行你的指令碼總時間是比以前高的,這是我們測量每個函數執行時間的損失。


使用line_profile模組

        line_profile 給出了在你代碼美一行花費cpu時間。

        首先需要安裝line_profiler:

                pip install line_profiler


接下來,你需要制定你想使用裝飾器@profile評估哪個函數(你不需要把它import 到你的檔案中)   650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6F/EF/wKiom1WtuhSCJLWTAAIfyDyspWo213.jpg" title="4.png" alt="wKiom1WtuhSCJLWTAAIfyDyspWo213.jpg" />

          

接下來測試該代碼:

        $ kernprof -l -v + 要執行的代碼

  650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6F/EF/wKiom1WtunGjlaE-AARCxdynI2o340.jpg" title="5.png" alt="wKiom1WtunGjlaE-AARCxdynI2o340.jpg" />

        -l 標識表明了逐行和-v標識表明詳細輸出。


使用memory_profile模組

        memory_profile模組被用於在逐行的基礎上,測量你代碼的記憶體使用量率。儘管如此,它可能使得你的代碼啟動並執行更慢。

        首先安裝memory_profiler

                $pip install memory_profiler

         也建議安裝psutil包,使得memory_profile模組啟動並執行更快。

                 $ pip install psutil


類似於line_profile的方式,使用裝飾器@profile來標記哪個函數被跟蹤。


$python -m memory_profiler + 要執行的代碼檔案

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6F/EC/wKioL1WtvmGiFjWaAAQImIsWaaQ189.jpg" title="6.png" alt="wKioL1WtvmGiFjWaAAQImIsWaaQ189.jpg" />


看上面的輸出,注意記憶體使用量率的單位是MiB,這代表的是MB(1MiB = 1.05MB).


使用guppy模組

        使用guppy模組你可以跟蹤每個類型在你代碼中每個階段(字元、元組、字典等等)有多少對象被建立。


安裝guppy:

$ pip install guppy


然後將你的代碼該改成如下:

#!/usr/bin/env pythonfrom guppy import hpydef read_file(fpath):    hp = hpy()    print "Heap at the beginning of the function\n", hp.heap()    BLOCK_SIZE = 1024    with open(fpath, ‘rb‘) as fd:        while True:            block = fd.read(BLOCK_SIZE)            if block:                yield block            else:                print "Heap at the end of the function\n", hp.heap()                returndef main():    hp = hpy()    print "Heap at the beginning of the function\n", hp.heap()    for i in read_file(‘/Users/David/Applications/py/dt‘):        #print i        pass    print "Heap at the end of the function\n", hp.heap()if __name__ == "__main__":    main()


執行該代碼:

$ python c9.py


650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6F/EC/wKioL1WtwlWC7D7qAAgVRIuUZSc843.jpg" title="8.png" alt="wKioL1WtwlWC7D7qAAgVRIuUZSc843.jpg" />


通過資料結果,可以看出每個str、dict、function等對象被建立。


通過以上幾個模組,可以更加清晰的瞭解python代碼的執行過程以及對資源的佔用情況。對代碼最佳化有很大的協助~~~ 

本文出自 “David” 部落格,請務必保留此出處http://davidbj.blog.51cto.com/4159484/1676671

python 代碼檢查,實現行級代碼最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.