2012-04-19 5 views
1

私は同じ種類のオブジェクトのリストを持っています。 main_object_listが言う、持っているときに、このアプローチは、動作しますが100.000、オブジェクトがPythonのリストにあるかどうかを素早くチェックする方法

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 

各オブジェクトは、オブジェクトの独自のリスト(通常は5〜10項目)私が行うために使用何

だったがあります要素、 それはひどく遅くなります。

私の回避策は、このされています:

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

より良いアプローチすべてのオブジェクトが一意でハッシュ可能な場合にセットを使用することです –

+0

main_object_liの各オブジェクトを呼び出す必要があります多くの時間と正しい順序で、あなたはありませんか? main_object_listのかなりのペアごとに何かする必要がありますか?10.000.000.000倍近くでしょうか?どのように速くすることができますか? – Arpegius

+0

Python 2.6以降の['set'](http://docs.python.org/library/stdtypes.html#set)、[' sets.Set'](http://docs.python.org/library /sets.html)をPython 2.3に移植しました。 – ephemient

答えて

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) 
+0

set.intersection(またはset&set)を試してみましたが、設定が試されていませんでした。ちょうど 'in'より速いと思っていませんでした – user815129

+1

@ user815129 'すぐにC言語で、Pythonレベルに戻ることなくそれは速くなければなりません。 – agf

+0

@ user815129もう1つの可能性は、独自のフラグを使用することです。私の編集を参照してください。 – agf

関連する問題