国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python 代碼優化詳解

2019-11-25 18:07:30
字體:
來源:轉載
供稿:網友

 選擇了腳本語言就要忍受其速度,這句話在某種程度上說明了 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

復制代碼 代碼如下:

from time import time
 t = time()
 list = ['a','b','is','python','jason','hello','hill','with','phone','test',
'dfdf','apple','pddf','ind','basic','none','baecr','var','bana','dd','wrd']
 #list = dict.fromkeys(list,True)
 print list
 filter = []
 for i in range (1000000):
     for find in ['is','hat','new','list','old','.']:
         if find not in list:
             filter.append(find)
 print "total run time:"
 print time()-t

  上述代碼運行大概需要 16.09seconds。如果去掉行 #list = dict.fromkeys(list,True) 的注釋,將 list 轉換為字典之后再運行,時間大約為 8.375 seconds,效率大概提高了一半。因此在需要多數據成員進行頻繁的查找或者訪問的時候,使用 dict 而不是 list 是一個較好的選擇。
 •集合 (set) 與列表 (list)
 
  set 的 union, intersection,difference 操作要比 list 的迭代要快。因此如果涉及到求 list 交集,并集或者差的問題可以轉換為 set 來操作。
 
  清單 2. 求 list 的交集:

復制代碼 代碼如下:

from time import time
 t = time()
 lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44]
 listb=[2,4,6,9,23]
 intersection=[]
 for i in range (1000000):
     for a in lista:
         for b in listb:
             if a == b:
                 intersection.append(a)
 print "total run time:"
 print time()-t

  上述程序的運行時間大概為:

復制代碼 代碼如下:

total run time:
38.4070000648

  清單 3. 使用 set 求交集

復制代碼 代碼如下:

from time import time
 t = time()
 lista=[1,2,3,4,5,6,7,8,9,13,34,53,42,44]
 listb=[2,4,6,9,23]
 intersection=[]
 for i in range (1000000):
     list(set(lista)&set(listb))
 print "total run time:"
 print time()-t

  改為 set 后程序的運行時間縮減為 8.75,提高了 4 倍多,運行時間大大縮短。讀者可以自行使用表 1 其他的操作進行測試。
 
  表 1. set 常見用法

語法 操作 說明
set(list1) | set(list2) union 包含 list1 和 list2 所有數據的新集合
set(list1) & set(list2) intersection 包含 list1 和 list2 中共同元素的新集合
set(list1) 主站蜘蛛池模板: 弥渡县| 无极县| 镇原县| 小金县| 汽车| 柏乡县| 福海县| 湘乡市| 北辰区| 宜州市| 大姚县| 天门市| 岐山县| 凤山县| 资兴市| 屯昌县| 衡阳县| 正镶白旗| 和硕县| 岑巩县| 东阿县| 古交市| 宜阳县| 县级市| 吉安市| 九龙坡区| 赣榆县| 赤水市| 松桃| 奉化市| 徐州市| 吉安县| 辽中县| 阳新县| 额尔古纳市| 大关县| 霞浦县| 汨罗市| 上蔡县| 雷州市| 静安区|