Nhanh nhất (và dễ hiểu nhất) là với một danh sách hiểu.
Xem thời gian:
import timeit
import random
c=10000
class SomeObj:
def __init__(self, i):
self.attr=i
def loopCR():
l=[]
for i in range(c):
l.append(SomeObj(random.random()))
return l
def compCR():
return [SomeObj(random.random()) for i in range(c)]
def loopAc():
lAttr=[]
for e in l:
lAttr.append(e.attr)
return lAttr
def compAc():
return [e.attr for e in l]
t1=timeit.Timer(loopCR).timeit(10)
t2=timeit.Timer(compCR).timeit(10)
print "loop create:", t1,"secs"
print "comprehension create:", t2,"secs"
print 'Faster of those is', 100.0*abs(t1-t2)/max(t1,t2), '% faster'
print
l=compCR()
t1=timeit.Timer(loopAc).timeit(10)
t2=timeit.Timer(compAc).timeit(10)
print "loop access:", t1,"secs"
print "comprehension access:", t2,"secs"
print 'Faster of those is', 100.0*abs(t1-t2)/max(t1,t2), '% faster'
Prints:
loop create: 0.103852987289 secs
comprehension create: 0.0848100185394 secs
Faster of those is 18.3364670069 % faster
loop access: 0.0206878185272 secs
comprehension access: 0.00913000106812 secs
Faster of those is 55.8677438315 % faster
Vì vậy, danh sách hiểu là cả hai nhanh hơn để viết và nhanh hơn để thực thi.
Nguồn
2012-06-19 05:51:05
'hiệu quả' nằm trong con mắt của người xem ... –
@Pyson: Không, không "hiệu quả" được đo bằng độ phức tạp, thời gian tính toán, các dòng mã và/hoặc sử dụng bộ nhớ. – Junuxx
@Junuxx: hầu hết mọi người không kiểm tra từng và từng trường hợp hiểu và so với vòng lặp để xem ít chu kỳ CPU hơn. Nếu bạn đang sử dụng Python, nó có lẽ là về dễ dàng để viết và đọc - không phải tốc độ tuyệt đối. Những gì bạn đã nêu ở đó, thời gian tính toán, các dòng mã và/hoặc sử dụng bộ nhớ, có thể hoàn toàn mâu thuẫn với nhau. Tăng gấp đôi mã có thể nhanh hơn và sử dụng ít bộ nhớ hơn, nhưng mất nhiều thời gian hơn để đọc và viết với tư cách là một lập trình viên. Đó là nhiều hơn * hiệu quả *? Nhanh hơn để thực thi hoặc nhanh hơn để viết bằng Python? Đây là quan điểm của tôi. –