簡體   English   中英

在python中搜索列表的最快方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM