1. 程式人生 > >學Python途中可能會遺漏的一些關鍵點

學Python途中可能會遺漏的一些關鍵點

Python 字典中使用了 hash table,因此查詢操作的複雜度為 O(1),而 list 實際是個陣列,在 list 中,查詢需要遍歷整個 list,其複雜度為 O(n),因此對成員的查詢訪問等操作字典要比 list 更快。

import time

arr = ['apple', 'samsung', 'huawei', 'python', 'java', 'c', 'C++', 'C#', 'php', 'ruby',\
 'go','asp', 'html', 'huashuo', 'lianxiang', 'deer', 'jpg', 'pdf', 'txt', 'png', 'exe']
 
# arr = dict.fromkeys(arr, True)

t = time.time()      # 程式開始的時間
filet = []
for i in range(1000000):
    for i in ['apple', 'pdf', 'lianxiang', 'java', 'samsung']:
        if i in arr:           # 沒有去掉前一句註釋的時候,這裡的arr使用的是列表那個結構,如果去掉註釋,那麼它是轉換為字典型別使用的
            filet.append(i)
end = time.time() - t  	# 程式結束的時間

filet = set(filet)
print(end)
print(filet)

上述程式碼執行大概需要 5.7s左右的時間。如果去掉行 # arr = dict.fromkeys(arr, True)的註釋,將 list 轉換為字典之後再執行,時間大約為 3.7s,效率提高了一小半。因此在需要多資料成員進行頻繁的查詢或者訪問的時候,使用 dict 而不是 list 是一個較好的選擇。

set 常見用法

語法	                       操作	            	 說明
set(list1) | set(list2)	   union			包含 list1 和 list2 所有資料的新集合
set(list1) & set(list2)	   intersection			包含 list1 和 list2 中共同元素的新集合
set(list1) - set(list2)	   difference			在 list1 中出現但不在 list2 中出現的元素的集合

對迴圈的優化
對迴圈的優化所遵循的原則是儘量減少迴圈過程中的計算量,有多重迴圈的儘量將內層的計算提到上一層。 下面通過例項來對比迴圈優化後所帶來的效能的提高。如果不進行迴圈優化,其大概的執行時間約為 132.375。

迴圈優化前

from time import time 
t = time() 
lista = [1,2,3,4,5,6,7,8,9,10] 
listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01] 
for i in range (1000000): 
    for a in range(len(lista)): 
        for b in range(len(listb)): 
            x=lista[a]+listb[b] 
print("total run time:")
print(time()-t)

現在進行如下優化,將長度計算提到迴圈外,將第三層的計算 lista[a] 提到迴圈的第二層。

迴圈優化後

from time import time 
t = time() 
lista = [1,2,3,4,5,6,7,8,9,10] 
listb =[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,0.01] 
len1=len(lista) 
len2=len(listb) 
for i in range (1000000): 
    for a in range(len1): 
        temp=lista[a] 
        for b in range(len2): 
            x=temp+listb[b] 
print(time()-t)

上述優化後的程式其執行時間縮短為 102.171999931。優化前的 lista[a] 被計算的次數為 10000001010,而在優化後的程式碼中被計算的次數為1000000*10,計算次數大幅度縮短,因此效能有所提升。

ASCII碼轉換

ord('a')			//97,用於ASCII碼將字元型轉為數字型
chr(97)			//a,  用於ASCII碼將數字型轉為字元型