[英]Fastest way to search a list in python
當你這樣做"test" in a
,其中a
是一個列表確實蟒蛇做了順序搜索在名單上,它創建一個哈希表表示,以優化查詢? 在應用程序中我需要這個,因為我會在列表上進行大量的查找,所以最好做b = set(a)
然后"test" in b
嗎? 另請注意,我將擁有的值列表不會有重復數據,我實際上並不關心它的順序; 我只需要能夠檢查是否存在值。
另請注意,我將擁有的值列表不會有重復數據,我實際上並不關心它的順序; 我只需要能夠檢查是否存在值。
不要使用列表,而是使用set()
。 它正是你想要的屬性,包括一個速度極快in
測試。
我已經看到了20倍甚至更高的加速度(大多數是重數字運算),其中一個列表被更改為一組。
帶有列表a
"test" in a
將進行線性搜索。 動態設置哈希表比線性搜索要昂貴得多。 另一方面"test" in b
將進行amoirt化O(1)散列查找。
在您描述的情況下,似乎沒有理由在集合上使用列表。
我認為最好采用set實現。 我知道集合有O(1)查找時間。 我認為列表需要O(n)查找時間。 但即使列表也是O(1)查找,切換到集合也不會丟失任何內容。
此外,集合不允許重復值。 這將使您的程序稍微提高內存效率
列表和元組似乎有相同的時間,使用“in”對大數據來說很慢:
>>> t = list(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.66235494614
>>> t = tuple(range(0, 1000000))
>>> a=time.time();x = [b in t for b in range(100234,101234)];print(time.time()-a)
1.6594209671
這是更好的解決方案: 在一個巨大的列表中查找/搜索的最有效方式(python)
這超級快:
>>> from bisect import bisect_left
>>> t = list(range(0, 1000000))
>>> a=time.time();x = [t[bisect_left(t,b)]==b for b in range(100234,101234)];print(time.time()-a)
0.0054759979248
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.