Python 在另一个列表中搜索列表项的最佳方法?
我有一个长度为32683的列表,我必须在另一个长度为2905的列表中搜索该列表中的项目,我这样写的: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),类似这样
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)
,这不是很好。将两个列表转换为集合并计算交集——这比手动计数快得多