1

我有一个对象列表,每个对象都相同。

每个对象都有自己的对象列表(通常只有 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 秒),但我怀疑可能会有不同的、更好的方法。此外,这个例子之所以有效,是因为每个对象都有一个标志属性,顺便说一下,使用可能已经在其他函数中设置/取消设置的标志并不是那么优雅(如果在父函数的主体中调用此函数使用相同标志机制的函数,这会搞砸一切,设置每个对象标志)

有没有更正确的pythonesque方法来快速检查一个对象是否在main_object_list中?

4

1 回答 1

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)
于 2012-04-19T04:29:04.510 回答