Python 在另一个列表中搜索列表项的最佳方法?

Python 在另一个列表中搜索列表项的最佳方法?,python,python-3.x,list,performance,search,Python,Python 3.x,List,Performance,Search,我有一个长度为32683的列表,我必须在另一个长度为2905的列表中搜索该列表中的项目,我这样写的: for item in phone_register_users: if item not in service_users_ids: counter += 1 (电话\注册\用户的长度为32683,服务\用户\ ID为2905) 但是完成它大约需要14秒,这太多了,我如何改进它呢?根据,搜索列表的复杂性是O(n),你可以尝试使用集合或dict将其简化为O(1),类似这样

我有一个长度为32683的列表,我必须在另一个长度为2905的列表中搜索该列表中的项目,我这样写的:

for item in phone_register_users:
    if item not in service_users_ids:
       counter += 1
(电话\注册\用户的长度为32683,服务\用户\ ID为2905) 但是完成它大约需要14秒,这太多了,我如何改进它呢?

根据,搜索
列表的复杂性是
O(n)
,你可以尝试使用
集合
dict
将其简化为
O(1)
,类似这样的东西应该足够了:

service_users_ids = [...]
phone_register_users = [...]
service_users_ids_set = set(service_users_ids)
for item in phone_register_users:
    if item not in service_users_ids_set:
        counter += 1
您可以使用设置:

set1 = set(phone_user_register_list1)
set2 = set(services_user_ids_list2)
unq = set1.intersection(set2)
从交叉点,您可以获得手机用户注册和服务用户id中的元素列表

因此,要对电话注册中但不在服务用户id使用中的元素进行计数器:

counter = len(phone_register_user)-len(unq)

当每个列表都有大量重复值时,这个答案是最好的。如果每个列表中的ID都是唯一的,则交集将采用
O(N*M)
,这不是很好。将两个列表转换为集合并计算交集——这比手动计数快得多