Tôi đang tìm kiếm danh sách lọc tương tự nhưng muốn có định dạng hơi khác so với những gì được trình bày ở đây.
Cuộc gọi get_hats()
ở trên là tốt nhưng bị giới hạn trong việc tái sử dụng. Tôi đang tìm kiếm thứ gì đó giống như get_hats(get_clothes(all_things))
, nơi bạn có thể chỉ định nguồn (all_things)
và sau đó là ít hoặc nhiều mức bộ lọc get_hats()
, get_clothes()
tùy thích.
Tôi tìm thấy một cách để làm điều đó với máy phát điện:
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
này sau đó có thể được gọi bởi:
get_hats(get_clothes(all_things))
Tôi đã thử nghiệm các giải pháp ban đầu, giải pháp vartec và giải pháp bổ sung này để xem hiệu quả, và hơi ngạc nhiên bởi kết quả. Mã như sau:
Setup:
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
giải pháp gốc:
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)
Giải pháp của tôi:
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 của giải pháp:
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
đang
Thời gian:
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)
Kết quả:
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
Các phát biểu dường như nhanh hơn một chút, sự khác biệt về thời gian giữa các giải pháp và vartec của tôi có lẽ chỉ tiếng ồn. Nhưng tôi thích sự linh hoạt của việc có thể áp dụng bất kỳ bộ lọc nào được yêu cầu theo thứ tự nào.
Nếu bạn lo lắng về hiệu suất, bạn có ** thử nghiệm ** hiệu suất không? –
Tôi sẽ có nếu tôi nghĩ rằng nó không rõ ràng. – cammil
"hiển nhiên" là một từ nguy hiểm khi nói đến hiệu suất. –