pythondictin
我們以往的經驗,生成對比信息的字典代碼如下:
def getCurrentCompareMessageDict0(dict0, dict1):
'''未被優化的獲取當前對比信息字典'''
dlist0=list(dict0.keys())
dlist1=list(dict1.keys())
dict2={}
for i in range(len(dlist1)):
if dlist1[i] not in dlist0:
key=dlist1[i]
value=[0, dict1[dlist1[i]]]
dict2[key]=value
else:
if dict1[dlist1[i]]/100.0 != dict0[dlist1[i]]:
key=dlist1[i]
value=[dict0[dlist1[i]], dict1[dlist1[i]]]
dict2[key]=value
return dict2
即,先構建兩個dict的key列表。
然後,以key列表的長度為上限,進行for循環,採用DICT[KEY]的方式來進行列表數據的篩選。
這個方法的運行是超級慢的。
㈡ python內置數據類型列表list和字典dict的性能
我們來討論下python的兩種最重要的內置數據類型列表list和字典dict上,各種操作的復雜度。
list列表數據類型常用操作性能:
1、按索引取值和賦值(v=a[i],a[i]=v)
由於列表的隨機訪問特性,這兩個操作執行時間與列表大小無關,均為O(1)
2、列表的曾長,可以選擇append()和_add_() "+"
list.append(v)的執行時間O(1)
list = list + [v],執行時間是O(n+k),因為新增了一個新的列表,其中k是被加的列表長度
舉例:4種生成前n個整數列表的方法
如圖:
我們可以計算一下這四個函數的耗時,如下
執行結果:
我們可以看到,4種方法運行時間差別很大,test1使用列表連接最慢,而test4使用list range最快,速度相差近200倍。
如下圖,我們總結下list基本操作的性能如何:
上圖可知pop()從列表末尾移除元素O(1),但是pop(i)從列表中間移除元素要O(n),為什麼呢?
因為從中部移除元素,要把移除元素後面的元素全部向前挪一位,才保證了列表按索引取值和賦值很快,達到O(1)。
dict數據類型:
字典和列表不同,dict根據key找到value,而list根據index。
字典最常用的取值get和賦值set,其性能為O(1),而contain(in)操作判斷字典是否存在某個key,其性能也是O(1)
list和dict的in操作對比:
設計一個性能試驗,驗證list中檢索一個值,對比dict中檢索一個值的耗時對比。如下程序:
如果如下:
可見list的in操作復雜度為O(n)
PS:大家可以去python官方的演算法復雜度網站看看:
https://wiki.python.org/moin/TimeComplexity
㈢ python中in後面大括弧是什麼
代表dict字典數據類型。
pythonin後面的大括弧即花括弧,代表dict字典數據類型,字典是由鍵對值組組成。冒號分開鍵和值,逗號隔開組。
python中的小括弧,代表tuple元組數據類型,元組是一種不可變序列,python中的中括弧,代表list列表數據類型。分別用來代表不同的python基本內置數據類型。
㈣ python中字典的使用方法怎麼樣的
dict全稱dictionary,使用鍵-值(key-value)存儲,具有極快的查找速度。
舉個例子,假設要根據同學的名字查找對應的成績,如果用list實現,需要兩個list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
給定一個名字,要查找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,list越長,耗時越長。
如果用dict實現,只需要一個「名字」-「成績」的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。用Python寫一個dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
把數據放入dict的方法,除了初始化時指定外,還可以通過key放入:
>>> d['Adam'] = 67
>>> d['Adam']
67
由於一個key只能對應一個value,所以,多次對一個key放入value,後面的值會把前面的值沖掉:
>>> d['Jack'] = 90
>>> d['Jack']
90
>>> d['Jack'] = 88
>>> d['Jack']
88
如果key不存在,dict就會報錯:
>>> d['Thomas']
Traceback (most recent call last):
File "", line 1, in KeyError: 'Thomas'
要避免key不存在的錯誤,有兩種辦法,一是通過in判斷key是否存在:
>>> 'Thomas' in dFalse
二是通過dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
要刪除一個key,用pop(key)方法,對應的value也會從dict中刪除:
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}