Python 2.7 如何在python中快速检查对象是否在列表中
我有一张物品清单,每一件都是一样的 每个对象都有自己的对象列表(通常只有5-10项) 我过去常做的是:Python 2.7 如何在python中快速检查对象是否在列表中,python-2.7,python,Python 2.7,Python,我有一张物品清单,每一件都是一样的 每个对象都有自己的对象列表(通常只有5-10项) 我过去常做的是: for o in main_object_list: obj_list = o.get_this_object_list() for i in obj_list: if i in main_object_list: //do something with i 虽然这种方法可行,但当主对象列表有100.000个元素时, 它走得非常慢 我的
for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if i in main_object_list:
//do something with i
虽然这种方法可行,但当主对象列表有100.000个元素时,
它走得非常慢
我的解决办法是:
for o in main_object_list:
o.flag = True
for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if i.flag:
//do something with i
它的速度快了几个数量级(从22分钟到17秒)
但我怀疑可能有另一种更好的方法。此外,这个例子之所以有效,是因为每个对象都有一个flag属性,顺便说一句,事实并非如此
优雅地使用可能已在其他函数中设置/未设置的标志
(如果在使用相同函数的父函数体中调用此函数
标记机制,这会搞乱一切,设置每个对象(标记)
有没有更正确的pythonnesque方法来快速检查对象是否处于活动状态
主对象列表?如果要使用自己的标志,可以执行以下操作:
for o in main_object_list:
o.my_special_flag = True
for o in main_object_list:
obj_list = o.get_this_object_list()
for i in obj_list:
if hasattr(i, 'my_special_flag'):
否则,设置。交叉点
将以最快的速度:
main_object_set = set(main_object_list)
for o in main_object_list:
obj_list = o.get_this_object_list()
objs_in_main_list = main_object_set.intersection(obj_list)
for i in objs_in_main_list:
//do something with i
或:
更好的方法是使用集合,如果所有对象都是唯一的和可散列的,那么您需要多次调用main_object_列表中的每个对象,并且顺序正确,不是吗?你真的需要为每一对主对象列表做点什么,比如说大约10.000.000.000次?那怎么可能更快呢?在Python2.6及更高版本中,一直到Python2.3中,每个对象都是可散列且唯一的,列表实际上是这个观点下的一个集合。我试着使用set(和dict)。它跑得更快,但我的速度只有10-15%。我不需要按照特定的顺序处理每个列表,但我没有尝试set.intersection(或set&set),只是认为它不会比'in'@user815129更快,它在s中一次执行大量的
,在C中,而不会返回到Python级别。它应该更快。@user815129另一种可能是使用您自己的标志;请参阅我的编辑。
main_object_set = set(main_object_list)
objs_in_main_list = set().update(
*(o.get_this_object_list() for o in main_object_list))
objs_in_main_list.intersection_update(main_object_set)