我有一个对象列表,每个都是同一类。
每个对象都有自己的对象列表(通常只有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
虽然这种方法有效,但当main_object_list有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属性,顺便说一下它不是这样 优雅地使用可能已在其他功能中设置/未设置的标志 (如果在使用相同功能的父函数体中调用此函数 标志机制,这会弄乱一切,设置每个对象标志)
是否有更正确的pythonesque方式来快速检查对象是否在 main_object_list?
答案 0 :(得分:2)
如果你想使用自己的旗帜,你可以这样做:
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'):
否则set.intersection
的速度最快:
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_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)