मैं सूचियों की इसी तरह के फ़िल्टरिंग की तलाश में था लेकिन यहां प्रस्तुत किए गए प्रस्ताव के लिए थोड़ा अलग प्रारूप बनाना चाहता था।
ऊपर 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 के समाधान के बीच के समय में अंतर शायद सिर्फ शोर कर रहे हैं। लेकिन मैं जो कुछ भी क्रम में आवश्यक है उसे लागू करने में सक्षम होने की लचीलापन पसंद करता हूं।
यदि आप प्रदर्शन के बारे में चिंतित हैं, तो क्या आपने ** परीक्षण ** प्रदर्शन किया था? –
अगर मैंने सोचा कि यह स्पष्ट नहीं है तो मुझे लगता होगा। प्रदर्शन के समय – cammil
"स्पष्ट" एक खतरनाक शब्द है। –