Python如何使用in
關鍵字檢查迭代器中是否存在給定值。它執行線性搜索嗎?如:Python的`in`關鍵字執行線性搜索嗎?
def naive(iterable, val):
for i in range(len(l)):
if iterable[i]==val:
return True
return False
?或者它有不同的做法。除了線性搜索?
Python如何使用in
關鍵字檢查迭代器中是否存在給定值。它執行線性搜索嗎?如:Python的`in`關鍵字執行線性搜索嗎?
def naive(iterable, val):
for i in range(len(l)):
if iterable[i]==val:
return True
return False
?或者它有不同的做法。除了線性搜索?
Python的in
運營商要求在容器上的__contains__
神奇的功能。這對不同容器以不同方式實施。
對於str
英格斯,list
S和tuple
S,它是一個線性搜索(O(N)
),但因爲它在C'S實現它可能會比你在你的問題有純Python的速度更快。
對於set
s和dict
s,這是一個散列表查找,速度要快得多(O(1)
平均大小寫)。
其他容器將具有不同的性能特徵。我不認爲標準庫中有任何內容,但是平衡樹數據結構可能是O(log N)
。
如果它是一個線性數據結構,是的,這是一個線性搜索。例子:一個列表,一個字符串。如果它是一個集合,它是一個O(1)
操作,或者如果我們正在檢查密鑰是否在字典中也是O(1)
。
in
關鍵字取決於您所調用的對象類中的__contains__
方法的實現。這意味着對於任何不可散列的東西(列表,字符串),它執行線性搜索,但對於可排列的數據結構(字典,集合),它將被分攤到不變的時間。
+1提到實現日誌時間'__contains__'的均衡樹的可能性。還值得一提的是,如果*不是'__contains__'並且它使用迭代器協議 - 這意味着它也適用於生成器,那麼它將回退到線性搜索。 – lvc 2013-03-11 05:02:03