python編碼最佳實踐之總結

相信用python的同窗很多,本人也一直對python情有獨鍾,毫無疑問python做爲一門解釋性動態語言沒有那些編譯型語言高效,可是python簡潔、易讀以及可擴展性等特性使得它大受青睞。python

     工做中不少同事都在用python,但每每不多有人關注它的性能和慣用法,通常都是現學現用,畢竟python不是咱們的主要語言,咱們通常只是使用它來作一些系統管理的工做。可是咱們爲何不作的更好呢?python zen中有這樣一句:There should be one-- and preferably only one --obvious way to do it. Although that way may not be obvious at first unless you're Dutch. 大意就是python鼓勵使用一種最優的方法去完成一件事,這也是和ruby等的一個差別。因此一種好的python編寫習慣我的認爲很重要,本文就重點從性能角度出發對python的一些慣用法作一個簡單總結,但願對你們有用~算法

    提到性能,最容易想到的是下降複雜度,通常能夠經過測量代碼迴路複雜度(cyclomatic complexitly)和Landau符號(大O)來分析, 好比dict查找是O(1),而列表的查找倒是O(n),顯然數據的存儲方式選擇會直接影響算法的複雜度。數組

1、數據結構的選擇:

     1. 在列表中查找:ruby

   對於已經排序的列表考慮用bisect模塊來實現查找元素,該模塊將使用二分查找實現數據結構

def find(seq, el) :
    pos = bisect(seq, el)
    if pos == 0 or ( pos == len(seq) and seq[-1] != el ) :
        return -1
    return pos - 1

    而快速插入一個元素能夠用:app

bisect.insort(list, element)

這樣就插入元素而且不須要再次調用 sort() 來保序,要知道對於長list代價很高.less

    2. set代替列表: 性能

    好比要對一個list進行去重,最容易想到的實現:測試

seq = ['a', 'a', 'b']
res = []
for i in seq:
    if i not in res:
        res.append(i)

顯然上面的實現的複雜度是O(n2),若改爲:spa

seq = ['a', 'a', 'b']
res = set(seq)

複雜度立刻降爲O(n),固然這裏假定set能夠知足後續使用。

另外,set的union,intersection,difference等操做要比列表的迭代快的多,所以若是涉及到求列表交集,並集或者差集等問題能夠轉換爲set來進行,平時使用的時候多注意下,特別當列表比較大的時候,性能的影響就更大。

    3. 使用python的collections模塊替代內建容器類型:

collections有三種類型:

  1. deque:加強功能的相似list類型
  2. defaultdict:相似dict類型
  3. namedtuple:相似tuple類型

 

       列表是基於數組實現的,而deque是基於雙鏈表的,因此後者在中間or前面插入元素,或者刪除元素都會快不少。 

       defaultdict爲新的鍵值添加了一個默認的工廠,能夠避免編寫一個額外的測試來初始化映射條目,比dict.setdefault更高效,引用python文檔的一個例子:

閱讀全文請點擊:http://click.aliyun.com/m/8718/

相關文章
相關標籤/搜索