我有一个超过100000个值的列表,我正在迭代这些值并检查每个值是否包含在另一个随机值列表中(相同大小)。
我是通过使用if item[x] in randomList
来做到这一点的。
这有多高效? python是否为每个容器进行某种散列,或者它是否在内部直接搜索另一个容器以找到我要查找的元素?
另外,如果它线性搜索,那么它是否会创建randomList的字典并用它进行查找?
答案 0 :(得分:7)
in
由它所适用的对象的__contains__
魔术方法实现,因此效率取决于此。例如,set
,dict
和frozenset
将是基于哈希的查找,而list
则需要线性搜索。但是,xrange
(或Python 3.x中的range
)有__contains__
方法,不需要线性搜索,而是可以使用开始/停止/步骤信息来确定一个真正的价值。 (例如:7 in xrange(4, 1000000)
不是线性完成的。)
自定义类可以自由地实现__contains__
但是他们认为合适但理想情况下应该提供一些有关如何在文档中这样做的信息“如果”不明显“。
答案 1 :(得分:1)
您需要将列表预转换为集合,其中散列可用于O(1)查找。
请参阅http://wiki.python.org/moin/TimeComplexity
(通常,您必须搜索“经典”列表中的每个元素以判断其中是否存在某些内容(除非您的数据结构还保留了所有元素的集合,但这会增加大量的时间和空间复杂性,程序员可以自己实现它。)
答案 2 :(得分:0)
答案 3 :(得分:0)
如果两个列表已排序,则可以不使用集合执行此操作,如下所示:
def gen(P1, P2):
i, j = 0, 0
I, J = len(P1), len(P2)
while i != I and j != J:
if P1[i] == P2[j]:
yield P1[i]
i, j = i + 1, j + 1
else:
if P1[i] < P2[j]:
i += 1
else:
j += 1
返回P1和P2的交点:
>>> P1 = [1, 2, 3, 5, 90]
>>> P2 = [2, 3, 5, 30, 48]
>>> list(gen(P1, P2))
[2, 3, 5]
该算法描述为here。