python字典的效率
1. 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
2. python中字典常用的方法有哪些,分別有什麼作用
寫法:字典序列[key] = 值 ***字典為可變類型
常用方法:
1、# 新增字典中的數據
dict1 = {'name':'huu','age':20,'gender':'男'}
dict1['id'] = 133
print(dict1)
2、# 修改字典中的數據
dict1['name'] = 'xiauaiguai'
print(dict1)
3、刪除字典或刪除字典中指定鍵值對
del()/del:
dict1 = {'name':'huanghu','age':30,'gender':'男'}
# del(dict1) 直接將字典刪除了,運行報錯
del dict1['name']
print(dict1)
# del dict1[names] 刪除不存在的key,運行報錯
4、清空字典
clear():
dict1.clear() # 清空字典
print(dict1)
5、查找
key值查找
如果當前查找的key存在則返回對應的值,否則則報錯
函數查找
get():如果當前查找的key不存在則返回第二個參數值(默認值),
如果省略第二個參數則返回 None
key()
dict1 = {'name':'huhu','age':20,'gender':'男'}
print(dict1['name']) # huhu
print(dict1['id']) # 報錯
# 1, get()查找
print(dict1.get('name')) # huanghu
print(dict1.get('id',133)) # 133--如果當前查找的key不存在則返回第二個參數值(默認值)
print(dict1.get('id')) # None--如果省略第二個參數則返回 None
# 2, keys() 查找字典中所有的key,返回可迭代對象
print(dict1.keys()) # dict_keys(['name', 'age', 'gender'])
# 3,values() 查找字典中所有的values,
print(dict1.values()) # dict_values(['huanghu', 30, '男'])
# 4, items() 查找字典中所有的鍵值對,返回可迭代對象,裡面的數據是元組,
元組數據1是字典中的key,元組數據2是字典key對應的值
print(dict1.items()) # dict_items([('name', 'huahu'), ('age', 20), ('gender', '男')])
3. python 字典為什麼這么快
因為字典是通過鍵來索引的,關聯到相對的值,理論上他的查詢復雜度是O(1)。
哈希表(也叫散列表),根據關鍵值對(Key-value)而直接進行訪問的數據備羨結構。它通過把key和value映射到表中一個位置來訪問記錄,這種查詢速度非常快,更新也快。而這個映射函數叫做哈希函數,存放值的數組叫做哈希表。 哈希函數的實唯肢現方式決定了哈希表的指滾世搜索效率。
4. python中字典的使用方法怎麼樣的
字典理解如下
另一個非常有用的 Python 內建數據類型是 字典 (參見 Mapping Types — dict )。字典在某些語言中可能稱為 聯合內存 ( associative memories )或 聯合數組 ( associative arrays )。序列是以連續的整數為索引,與此不同的是,字典以 關鍵字 為索引,關鍵字可以是任意不可變類型,通常用字元串或數值。如果元組中只包含字元串和數字,它可以作為關鍵字,如果它直接或間接的包含了可變對象,就不能當作關鍵字。不能用列表做關鍵字,因為列表可以用索引、切割或者 append() 和 extend() 等方法改變。
理解字典的最佳方式是把它看作無序的鍵: 值對 (key:value 對)集合,鍵必須是互不相同的(在同一個字典之內)。一對大括弧創建一個空的字典: {} 。初始化列表時,在大括弧內放置一組逗號分隔的鍵:值對,這也是字典輸出的方式。
字典的主要操作是依據鍵來存儲和析取值。也可以用 del 來刪除鍵:值對(key:value)。如果你用一個已經存在的關鍵字存儲值,以前為該關鍵字分配的值就會被遺忘。試圖從一個不存在的鍵中取值會導致錯誤。
對一個字典執行 list(d.keys()) 將返回一個字典中所有關鍵字組成的無序列表(如果你想要排序,只需使用 sorted(d.keys()) )。[2] 使用 in 關鍵字(指Python語法)可以檢查字典中是否存在某個關鍵字(指字典)。
5. python 字典和元組遍歷速度哪個快
當然是元組了,元組就相當於數組,直接按照索引去取元素。而字典是按照key去取元素(類似於hash表),速度當然比不上元組了。下面的測試可以提供一些直觀的感覺。
$python-mtimeit-s'a=dict(a=12,b=13,c=14)''fork,vina.items():''pass'
1000000loops,bestof3:0.391usecperloop
$python-mtimeit-s'a=(12,13,14)''forvina:''pass'
10000000loops,bestof3:0.12usecperloop
可以看到遍歷同樣是三個元素的dict的時間大致上是tuple的3倍左右。 (實際上這個時間包括了創建 dict 和 tuple 的時間,創建dict的時間也是要大於創建tuple的時間的,這里就不細分了,總之,dict的創建、訪問時間一定是大於tuple的)
但是在python中,dict是做過極度優化的,其效率已經非常高了,因為在python中它的使用實在是太廣了。所以在實際編程中,一般我們只根據實際需求來考慮使用什麼數據結構 (dict, list, set, tuple),而不是根據不同數據結構的訪問速度差別。
6. python 字典和元組,列表取數速度哪個快
查詢的話字典快一點,如果知道索引直接讀取,應該是元組快一點。
7. 濡備綍榪愮敤python涓鐨勫瓧鍏革紵
瀛楀吀灞炰簬python涓鐨勪竴縐嶆暟鎹緇撴瀯錛屽畠鏄鐢遍敭鍊煎(key=value)緇勬垚鐨勶紝鍏朵腑鈥榢ey鈥樻槸鍞涓鐨勪笉鍙鍙樼殑銆傝屽兼槸鍙鍙樼殑錛屼笖鍙浠ュ彇浠諱綍鏁版嵁綾誨瀷銆傚湪python緙栫▼涓緇忓父浣跨敤鍒板瓧鍏革紝榪愮敤濂藉瓧鍏稿彲浠ユ椂鎴戜滑鍦ㄧ紪紼嬩腑鏇村姞杞繪澗銆傞偅涔堝備綍浣跨敤瀛楀吀鍛錛屼粖澶╁皬緙栧氨涓澶у朵粙緇嶄笅瀛楀吀鐨勫嚑縐嶇畝鍗曚嬌鐢ㄦ柟娉曘
鎵撳紑PyCharm錛屽彸閿鐐瑰嚮鍒涘緩濂界殑欏圭洰鍚嶏紝閫夋嫨銆恘ew銆--銆怭ython File銆戞柊寤轟竴涓猵ython鏂囦歡銆傛枃浠跺悕鏍規嵁鑷宸辨儏鍐靛~鍐欍傝繖閲屽皬緙栦互test.py鏂囦歡涓轟緥銆
瑕佽繍鐢ㄥ瓧鍏革紝閭d箞灝卞繀欏誨厛瀹氫箟瀛楀吀銆傚瓧鍏告槸鐢遍敭鍊煎(key=value)緇勬垚鐨勶紝姣忎釜閿鍊煎逛箣闂撮氳繃閫楀彿(,)鍒嗗壊寮 ,渚嬪傦細di={'name':'澶嶄粐涔嬬帇','day':'22'}
姝ゅ栵紝鎴戜滑榪樺彲浠ラ氳繃dict()鍑芥暟鏉ュ壋寤轟竴涓瀛楀吀錛屽湪dict鎷鍙烽噷闈㈡垜浠閫氳繃鍙橀噺璧嬪肩殑褰㈠紡杈撳叆鍐呭廣備緥濡:d=dict(a=123,b='hello')
瀹氫箟濂藉瓧鍏鎬箣鍚庯紝鎴戜滑闇瑕佸幓浣跨敤瀛楀吀閲岀殑鍊礆紝閭d箞濡備綍鍘昏塊棶瀛楀吀閲岄潰鐨勫煎憿錛熷洜涓哄瓧鍏告槸閿鍊煎圭殑褰㈠紡錛屾墍浠ユ垜浠鍙浠ラ氳繃閿鏉ヨ塊棶瀵瑰簲鐨勫箋傝繖閲屽皬緙栦互鍙栤榥ame鈥欑殑鍊間負渚嬶紝鍦╰est.py鏂囦歡涓杈撳叆print(di['name']),鐒跺悗鍙抽敭鐐瑰嚮鈥渞un鈥濊繘琛岃繍琛岋紝鍗沖彲鏌ョ湅杈撳嚭瀵瑰簲鐨勫箋
瀛楀吀閲岀殑鍏冪礌涓嶅彲鑳戒竴鎴愪笉鍙樼殑錛岄偅涔堟垜浠瑕佸備綍鍘諱慨鏀瑰瓧鍏擱噷鐨勫厓緔犲憿錛熷悓鏍鋒垜浠鍙浠ラ氳繃閿鏉ヨ繘琛屼慨鏀瑰瑰簲鐨勫箋傚湪python鏂囦歡涓杈撳叆di['day']='25',騫朵笖閫氳繃print(di) 杈撳嚭瀛楀吀錛屽湪杈撳嚭緇撴灉涓鍙浠ョ湅鍒伴敭鈥榙ay鈥欏瑰簲鐨勫煎彉涓25浜嗐 娉錛氬湪瀛楀吀涓閿鏄鍞涓鐨勶紝鍊兼槸鍙鍙樼殑錛屽苟涓斿彲浠ュ彇浠諱綍鏁版嵁綾誨瀷銆
鍦╰est.py鏂囦歡涓杈撳叆di['color']='綰㈣壊',鐒跺悗閫氳繃print(di)杈撳嚭瀛楀吀錛屾垜浠鍙浠ョ湅鍒板瓧鍏擱噷澶氬嚭浜哻olor榪欎釜閿鍊煎廣傞氳繃榪欎釜鏂規硶鎴戜滑鍙浠ュ悜瀛楀吀閲屾彃鍏ユ垜浠闇瑕佺殑鍏冪礌銆 娉:python3.6涔嬪悗瀛楀吀鏄鏈夊簭鐨勶紝鍥犱負灝忕紪鐢ㄧ殑鏄痯ython3.5鐗堟湰鐨勶紝鎵浠ヨ緭鍑虹粨鏋滄槸鏃犲簭鐨勩
姝ゅ栬繕鍙浠ラ氳繃setdefault鏂規硶鏉ユ煡璇㈠拰娣誨姞瀛楀吀鍏冪礌銆傛垜浠闇瑕佸湪test.py鏂囦歡涓杈撳叆print(di.setdefault('name'))錛岃繖涓鈥榥ame鈥欐槸瀛楀吀閲屽凡緇忔湁鐨勯敭錛屾墍浠ヨ繑鍥炵殑緇撴灉寮濮嬬洿鎺ヨ緭鍑哄瑰簲鐨勫箋傝緭鍏 di.setdefault('age',18) print(di) 鍙抽敭鐐瑰嚮榪愯岋紝榪欐椂鎴戜滑鍙浠ョ湅鍒板瓧鍏稿炲姞浜嗏榓ge鈥欒繖涓閿鍊煎廣
鏈鍚庣粰澶у朵粙緇嶄笅鎬庝箞鍒犻櫎瀛楀吀閲岄潰鐨勫厓緔犮傞氳繃pop鏂規硶鎴戜滑鍙浠ユ寚瀹氬垹闄ゅ瑰簲鐨勫厓緔犮傚湪test.py鏂囦歡涓杈撳叆 di.pop('day') print(di) 鐒跺悗鍙抽敭鐐瑰嚮榪愯岋紝灝卞彲浠ュ湪榪愯岀粨鏋滀腑鐪嬪埌鈥榙ay鈥欑殑閿鍊煎規病鏈変簡