私はリストの同様のフィルタリングを探していましたが、ここに示されているものとは少し異なる形式にしたかったのです。
上記のget_hats()
呼び出しは適切ですが、再利用には制限があります。get_hats(get_clothes(all_things))
私は、ソースを指定してから、必要に応じてフィルターのレベルをいくつでも指定できる、のよう(all_things)
なものを探していました。get_hats()
get_clothes()
私はジェネレーターでそれを行う方法を見つけました:
def get_clothes(in_list):
for item in in_list:
if item.garment:
yield item
def get_hats(in_list):
for item in in_list:
if item.headgear:
yield item
これは、次の方法で呼び出すことができます。
get_hats(get_clothes(all_things))
元のソリューション、vartecのソリューション、およびこの追加のソリューションをテストして効率を確認しましたが、その結果には多少驚いていました。次のようにコーディングします。
設定:
class Thing:
def __init__(self):
self.garment = False
self.headgear = False
all_things = [Thing() for i in range(1000000)]
for i, thing in enumerate(all_things):
if i % 2 == 0:
thing.garment = True
if i % 4 == 0:
thing.headgear = True
元の解決策:
def get_clothes():
return filter(lambda t: t.garment, all_things)
def get_hats():
return filter(lambda t: t.headgear, get_clothes())
def get_clothes2():
return filter(lambda t: t.garment, all_things)
def get_hats2():
return filter(lambda t: t.headgear and t.garment, all_things)
私の解決策:
def get_clothes3(in_list):
for item in in_list:
if item.garment:
yield item
def get_hats3(in_list):
for item in in_list:
if item.headgear:
yield item
vartecのソリューション:
def get_clothes4():
for t in all_things:
if t.garment:
yield t
def get_hats4():
for t in get_clothes4():
if t.headgear:
yield t
タイミングコード:
import timeit
print 'get_hats()'
print timeit.timeit('get_hats()', 'from __main__ import get_hats', number=1000)
print 'get_hats2()'
print timeit.timeit('get_hats2()', 'from __main__ import get_hats2', number=1000)
print '[x for x in get_hats3(get_clothes3(all_things))]'
print timeit.timeit('[x for x in get_hats3(get_clothes3(all_things))]',
'from __main__ import get_hats3, get_clothes3, all_things',
number=1000)
print '[x for x in get_hats4()]'
print timeit.timeit('[x for x in get_hats4()]',
'from __main__ import get_hats4', number=1000)
結果:
get_hats()
379.334653854
get_hats2()
232.768362999
[x for x in get_hats3(get_clothes3(all_things))]
214.376812935
[x for x in get_hats4()]
218.250688076
ジェネレーターの式はわずかに速いように見えます。私のソリューションとvartecのソリューションの時間差はおそらく単なるノイズです。しかし、私は、必要なフィルターを任意の順序で適用できる柔軟性を好みます。