[英]Python list.index() versus dictionary
我有大約50個字符串的列表。 我將反復(可能數以萬計)需要知道列表中項目的位置。 每次使用list.index()更好,還是創建一個將每個項目映射到其位置的字典? (我的直覺是創建字典,但是我不知道列表索引的基礎是什么,它可能是多余的。)
list.index()
將遍歷列表,直到找到要查找的項目為止,這是線性時間操作。 相比之下,在字典中查找字符串是恆定時間操作,因此字典方法可能會具有更好的性能。
由於您的鍵是字符串,而您的鍵卻相對較少,因此您可能要探索的另一個數據結構是trie 。
使用字典映射,而不是在列表中查找項目。 字典映射在評估之前使用每個項目的哈希。 與通過列表進行搜索並逐項評估(線性時間縮放)相比,散列比較要快得多,並且可以在固定時間內找到更快。
您可以像這樣配置您的查找:
import timeit
setup = 'from __main__ import foo_dict, foo_list'
限制僅50個長列表的比較:
l = list(str(i) for i in range(50))
d = dict((str(i), i) for i in range(50))
def foo_dict(k):
return d[k]
def foo_list(k):
return l.index(k)
timeit.repeat('[foo_dict(str(i)) for i in range(50)]', setup)
給我的回報:
[20.89474606513977, 23.206938982009888, 22.23725199699402]
和
timeit.repeat('[foo_list(str(i)) for i in range(50)]', setup)
返回:
[47.33547496795654, 47.995683908462524, 46.79590392112732]
由於使用哈希表,因此對字符串的dict查找要快得多,而對索引的列表查找要慢得多,因為它必須根據要查找的字符串評估其中的每個字符串。
字典將更快,並且創建起來也非常快:
indexer = dict((v, i) for i, v in enumerate(thelist))
enumerate
i in range(len(thelist))
(i, thelist[i])
產量(i, thelist[i])
,生成器表達式將“交換”元組(因為您需要將內容映射到索引,反之亦然)。
請注意,這僅在每個列表項都是可哈希的時才有效,但是由於您說的是字符串,因此應該沒問題。
dict
除其他外,迅速將(key, value)
元組的可迭代元組轉換為相應的字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.