選擇了腳本語言就要忍受其速度,這句話在某種程度上說明了 python 作為腳本的一個不足之處,那就是執行效率和性能不夠理想,特別是在 performance 較差的機器上,因此有必要進行一定的代碼優化來提高程序的執行效率。如何進行 Python 性能優化,是本文探討的主要問題。本文會涉及常見的代碼優化方法,性能優化工具的使用以及如何診斷代碼的性能瓶頸等內容,希望可以給 Python 開發人員一定的參考。

代碼優化能夠讓程序運行更快,它是在不改變程序運行結果的情況下使得程序的運行效率更高,根據 80/20 原則,實現程序的重構、優化、擴展以及文檔相關的事情通常需要消耗 80% 的工作量。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。
改進算法,選擇合適的數據結構
一個良好的算法能夠對性能起到關鍵作用,因此性能改進的首要點是對算法的改進。在算法的時間復雜度排序上依次是:
O(1) -> O(lg n) -> O(n lg n) -> O(n^2) -> O(n^3) -> O(n^k) -> O(k^n) -> O(n!)
因此如果能夠在時間復雜度上對算法進行一定的改進,對性能的提高不言而喻。但對具體算法的改進不屬于本文討論的范圍,讀者可以自行參考這方面資料。下面的內容將集中討論數據結構的選擇。
•字典 (dictionary) 與列表 (list)
Python 字典中使用了 hash table,因此查找操作的復雜度為 O(1),而 list 實際是個數組,在 list 中,查找需要遍歷整個 list,其復雜度為 O(n),因此對成員的查找訪問等操作字典要比 list 更快。
清單 1. 代碼 dict.py
上述代碼運行大概需要 16.09seconds。如果去掉行 #list = dict.fromkeys(list,True) 的注釋,將 list 轉換為字典之后再運行,時間大約為 8.375 seconds,效率大概提高了一半。因此在需要多數據成員進行頻繁的查找或者訪問的時候,使用 dict 而不是 list 是一個較好的選擇。
•集合 (set) 與列表 (list)
set 的 union, intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的問題可以轉換為 set 來操作。
清單 2. 求 list 的交集:
上述程序的運行時間大概為:
清單 3. 使用 set 求交集
改為 set 后程序的運行時間縮減為 8.75,提高了 4 倍多,運行時間大大縮短。讀者可以自行使用表 1 其他的操作進行測試。
表 1. set 常見用法
| 語法 | 操作 | 說明 |
|---|---|---|
| set(list1) | set(list2) | union | 包含 list1 和 list2 所有數據的新集合 |
| set(list1) & set(list2) | intersection | 包含 list1 和 list2 中共同元素的新集合 |
| set(list1) 主站蜘蛛池模板: 弥渡县| 无极县| 镇原县| 小金县| 汽车| 柏乡县| 福海县| 湘乡市| 北辰区| 宜州市| 大姚县| 天门市| 岐山县| 凤山县| 资兴市| 屯昌县| 衡阳县| 正镶白旗| 和硕县| 岑巩县| 东阿县| 古交市| 宜阳县| 县级市| 吉安市| 九龙坡区| 赣榆县| 赤水市| 松桃| 奉化市| 徐州市| 吉安县| 辽中县| 阳新县| 额尔古纳市| 大关县| 霞浦县| 汨罗市| 上蔡县| 雷州市| 静安区| |