學Python途中可能會遺漏的一些關鍵點
阿新 • • 發佈:2018-12-28
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碼將數字型轉為字元型