Python是一門非常酷的語言,因為很少的Python程式碼可以在短時間內做很多事情,並且,Python很容易就能支援多工和多重處理。
Python的批評者聲稱Python效能低效、執行緩慢,但實際上並非如此:嘗試以下6個小技巧,可以加快Pytho應用程式。
1、關鍵程式碼可以依賴於擴充套件包
Python使許多程式設計任務變得簡單,但是對於很關鍵的任務並不總是提供最好的效能。使用C、C++或者機器語言擴充套件包來執行關鍵任務能極大改善效能。這些包是依賴於平臺的,也就是說,你必須使用特定的、與你使用的平臺相關的包。簡而言之,該解決方案提供了一些應用程式的可移植性,以換取效能,您可以獲得只有通過直接向底層主機程式設計。下面這些擴充套件包你可以考慮新增到你的個人擴充套件庫中:
這些包有不同的作用和執行方式。例如,Pyrex 讓Python處理一些記憶體任務變得簡單高效;PyInline可以直接讓你在Python應用程式中使用C程式碼,雖然內聯程式碼被單獨編譯,但是如果你能高效的利用C程式碼,它可以在同一個地方處理每一件事情。
2、使用關鍵字排序
有很多古老的Python程式碼在執行時將花費額外的時間去建立一個自定義的排序函式。最好的排序方式是使用關鍵字和預設的sort()方法,看看下面的示例:
1 2 3 4 5 6 7 8 9 10 11 |
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也是一樣的。儘管你可以依賴於豐富的技術讓迴圈執行的更快,然而,開發者經常忽略的一個方法是避免在迴圈內部使用點拼接字串。對於下面的示例:
1 2 3 4 5 6 7 8 |
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、嘗試多種程式設計方法
每一次你建立應用的時候,都使用同一種程式設計方法,在某些情況下降導致程式執行會比預期的慢。在分析的過程中做一些小試驗。例如,當管理字典中的資料項時,可以採用安全的方法確定資料項是否已經存在並需要更新它,或者你可以直接新增條目,然後處理專案根本不存在的情況。
1 2 3 4 5 6 7 8 |
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已經有資料填充時,就有更好的方法可以選擇:
1 2 3 4 5 6 7 8 9 |
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++程式碼,結果是你可以再本機模式下執行應用,而不是依賴於直譯器。根據平臺和任務中,你可以看到顯著的效能提高。