首頁  >  文章  >  後端開發  >  如何對Python進行效能最佳化

如何對Python進行效能最佳化

伊谢尔伦
伊谢尔伦原創
2017-06-28 13:33:151289瀏覽

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

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

py

  1、關鍵程式碼可以依賴擴充包

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

Cython
PyInlne
PyPy
Pyrex

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

  2、使用關鍵字排序

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

import operator
somelist = [(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.upper
upperlist = []
append = upperlist.append
for 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 = 16
myDict = {}
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 = 16
myDict = {}
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++代码,结果是你可以再本机模式下执行应用,而不是依赖于解释器。根据平台和任务中,你可以看到显著的性能提高。

以上是如何對Python進行效能最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn