6個Python效能最佳化技巧

來源:互聯網
上載者:User

標籤:python

原文:6 Python Performance Tips

譯文:6個Python效能最佳化技巧

譯者:dwqs

Python是一門非常酷的語言,因為很少的Python代碼可以在短時間內做很多事情,並且,Python很容易就能支援多任務和多重處理。

Python的批評者聲稱Python效能低效、執行緩慢,但實際上並非如此:嘗試以下6個小技巧,可以加快Pytho應用程式。

 

  1、關鍵代碼可以依賴於擴充包

Python使許多編程任務變得簡單,但是對於很關鍵的任務並不總是提供最好的效能。使用C、C++或者機器語言擴充包來執行關鍵任務能極大改善效能。這些包是依賴於平台的,也就是說,你必須使用特定的、與你使用的平台相關的包。簡而言之,該解決方案提供了一些應用程式的可移植性,以換取效能,您可以獲得只有通過直接向底層主機編程。下面這些擴充包你可以考慮添加到你的個人擴充庫中:

  • Cython
  • PyInlne
  • PyPy
  • Pyrex

這些包有不同的作用和執行方式。例如,Pyrex 讓Python處理一些記憶體任務變得簡單高效;PyInline可以直接讓你在Python應用程式中使用C代碼,雖然內聯代碼被單獨編譯,但是如果你能高效的利用C代碼,它可以在同一個地方處理每一件事情。

 

  2、使用關鍵字排序

有很多古老的Python代碼在執行時將花費額外的時間去建立一個自訂的排序函數。最好的排序方式是使用關鍵字和預設的sort()方法,看看下面的樣本:

import operatorsomelist = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]somelist.sort(key=operator.itemgetter(0))somelist#Output = [(1, 5, 8), (6, 2, 4), (9, 7, 5)]somelist.sort(key=operator.itemgetter(1))somelist#Output = [(6, 2, 4), (1, 5, 8), (9, 7, 5)]somelist.sort(key=operator.itemgetter(2))somelist#Output = [(6, 2, 4), (9, 7, 5), (1, 5, 8)],

 

每一個案例的列表是根據你選擇作為關鍵字參數的索引排序的,這種方式對字串和數字排序同樣適用。

 

  3、最佳化迴圈

每一種程式設計語言都強調迴圈語句的最佳化,Python也是一樣的。儘管你可以依賴於豐富的技術讓迴圈啟動並執行更快,然而,開發人員經常忽略的一個方法是避免在迴圈內部使用點拼接字串。對於下面的樣本:

lowerlist = [‘this‘, ‘is‘, ‘lowercase‘]upper = str.upperupperlist = []append = upperlist.appendfor word in lowerlist:    append(upper(word))    print(upperlist)    #Output = [‘THIS‘, ‘IS‘, ‘LOWERCASE‘]

 

每一次調用str.upper,Python都會去求這個方法的值。但是如果你把求值的結果放入一個變數中,就能提高程式的效能。這個關鍵是減少Python內執行的迴圈次數,因為Python解析這些執行個體是比較慢的。

 

  4、使用新版本

任何一個線上上搜尋Python資料的人都會發現無數關於Python版本遷移的資訊。通常,Python每一個版本都針對之前的一個版本做了最佳化和改進,以讓Python啟動並執行更快。限制因素是你喜歡的函數庫是否也針對Python的新版本做了改進。

當你使用了新的函數庫,獲得了Python的新版本,你需要保證代碼依然能夠運行,檢查應用,修正差異。

然後,如果你僅僅是保證應用能夠在新版本上運行,你可能錯過新功能的更新。一旦你做了改進,在新版本下配置應用程式,檢查問題地區並優先使用新功能更新,對於之前的升級,使用者將看到更大效能的提升。

 

  5、嘗試多種編程方法

每一次你建立應用的時候,都使用同一種編程方法,在某些情況下降導致程式運行會比預期的慢。在分析的過程中做一些小實驗。例如,當管理字典中的資料項目時,可以採用安全的方法確定資料項目是否已經存在並需要更新它,或者你可以直接添加條目,然後處理項目根本不存在的情況。

n = 16myDict = {}for i in range(0, n):    char = ‘abcd‘[i%4]    if char not in myDict:        myDict[char] = 0        myDict[char] += 1        print(myDict)

 

當myDict是空時,上述的代碼通常會啟動並執行更快。但當myDict已經有資料填充時,就有更好的方法可以選擇:

n = 16myDict = {}for i in range(0, n):    char = ‘abcd‘[i%4]    try:        myDict[char] += 1    except KeyError:        myDict[char] = 1    print(myDict)

 

兩種情況下都輸出{‘d‘: 4, ‘c‘: 4, ‘b‘: 4, ‘a‘: 4},唯一的差異是輸出是怎麼獲得的。站在盒子外考慮和建立新的編程技巧都能讓你的程式獲得更快的運行速度。

  6、交叉編譯器

        開發人員有時會忘記電腦不能識別任何一種現在應用程式語言,它只識別機器代碼。為了運行程式,需要一個應用將人類可讀的代碼轉換成電腦能識別的代碼。當用一種語言寫程式時,例如Python,然後用另外一種語言來運行它,例如C++,從效能角度看是有道理的。這個取決於你想要用這個應用做什麼和主機系統能夠提供什麼資源。

        一個有趣的交叉編譯器,Nuitka, 能將Python轉換成C++代碼,結果是你可以再原生模式下執行應用,而不是依賴於解譯器。根據平台和任務中,你可以看到顯著的效能提高。


譯文原文:http://www.ido321.com/1433.html

6個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.