2015-03-03 51 views
3

由密鑰導入元件更快我有以下的腳本來測試其在列表中的索引快擷取元件比在字典

1.Fetching元件,或

2.Fetching元件在字典中鍵

import timeit 
import random 

lis1 = [random.randint(1,10000) for x in xrange(0,10001)] 
dict1 = {x:random.randint(1,10000) for x in xrange(0,10001)} 

def list_lookup(): 
    index = random.randint(0,10000) 
    x = lis1[index] 

def dict_lookup(): 
    index = random.randint(0,10000) 
    x = dict1[index] 


def main(): 
    print timeit.repeat("list_lookup()", "from __main__ import list_lookup",number=1000000) 
    print timeit.repeat("dict_lookup()", "from __main__ import dict_lookup",number=1000000) 

if __name__ == '__main__': 
    main() 

這是給下面的輸出

[1.208083152770996, 1.1942389011383057, 1.1882140636444092] 
[1.2461788654327393, 1.2427518367767334, 1.2414629459381104] 

儘管差異似乎可以忽略不計,但它好像字典查找需要稍長的時間

是因爲在字典中提取元素涉及2個步驟 - 首先散列鍵然後提取值(秒),而在列表中,我們只是從該列表的特定位置的存儲器地址獲取值

+0

基本上答案是**是**,但過短是一個答案。 – 2015-03-03 06:05:57

回答

2

實際上有三個步驟,它還需要比較(==)它找到的密鑰和給定的密鑰,以確保其回退正確的值,而不是恰好映射到同一個存儲桶的另一個值。除此之外,低效的散列/衝突會導致進一步的緩慢(因爲這個原因,字典查找是O(N)最壞的情況)。

0

在列表中查找是O(n),字典中的查找是攤銷O(1),關於數據結構中的項目數。

欲瞭解更多信息請參考此答案Here

+0

通過列表中的索引獲取項目與「查找」不同。 – jepio 2015-03-03 07:48:44