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 秒) が、別のより良いアプローチがあるのではないかと思います。さらに、この例は、各オブジェクトにフラグ プロパティがあるという理由だけで機能します。ちなみに、他の関数で設定/設定解除されている可能性のあるフラグを使用するのはあまりエレガントではありません (この関数が親の本体で呼び出された場合)。同じフラグメカニズムを使用する関数、これはすべてを台無しにし、すべてのオブジェクトフラグを設定します)

オブジェクトが main_object_list にあるかどうかをすばやく確認する、より正確な pythonesque の方法はありますか?

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 に答える