好問題!是的,你提到的兩種方法都必須迭代列表。 Python不會爲列表使用哈希表,因爲沒有限制列表元素是可哈希的。
如果你知道關於"Big O" notation,則list
數據結構被設計用於O(1)訪問,通過查找一個已知索引(例如, my_list[13]
。成員測試是O(n)。
還有其他數據結構針對O(1)速度進行成員資格測試(即__contains__
),即set
和dict
。這些實施與hashtables。
下面是如何使用IPython
驗證組和列表time-complexity,來確認這些權利要求的示例:
In [1]: short_list, long_list = range(1000), range(10000)
In [2]: timeit 'potato' not in short_list
10000 loops, best of 3: 40.9 µs per loop
In [3]: timeit 'potato' not in long_list
1000 loops, best of 3: 440 µs per loop
In [4]: small_set, big_set = set(short_list), set(long_list)
In [5]: timeit 'potato' not in small_set
10000000 loops, best of 3: 72.9 ns per loop
In [6]: timeit 'potato' not in big_set
10000000 loops, best of 3: 84.5 ns per loop
來源
2014-09-23 00:05:23
wim
的O趣味插圖(N):'$對於i 1 2 3 4 5; do python -mtimeit -s「l = range(int(1e $ i))」「(-1)not in l」; done' – 2014-09-23 00:15:30