2013-03-14 25 views

cevap

60
tup = tuple((element.foo, element.bar) for element in alist) 

Teknik olarak eşdeğer olacaktır. Liste kavraması gibidir, ancak tembel olarak değerlendirilir ve ara bir liste için bellek ayırmaya gerek yoktur.

tamlığı için liste anlama şu şekilde görünecektir:

tup = tuple([(element.foo, element.bar) for element in alist]) 

 

Not: attrgetter değil hızlıdır (alist Buraya milyon öğeleri vardır):

In [37]: %timeit tuple([(element.foo, element.bar) for element in alist]) 
1 loops, best of 3: 165 ms per loop 

In [38]: %timeit tuple((element.foo, element.bar) for element in alist) 
10 loops, best of 3: 155 ms per loop 

In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist)) 
1 loops, best of 3: 283 ms per loop 

In [40]: getter = operator.attrgetter('foo','bar') 

In [41]: %timeit tuple(map(getter, alist)) 
1 loops, best of 3: 284 ms per loop 

In [46]: %timeit tuple(imap(getter, alist)) 
1 loops, best of 3: 264 ms per loop 
+0

(+ 1) Teknik olarak, bu bir liste anlama değil (ama emin değilim OP umurunda :) :) – NPE

+2

sen coul d Ayrıca tuple (harita (operator.attrgetter ('foo', 'bar'), alist)) '' yapmak. Muhtemelen okunabilirlik için gönderdiğiniz olanı kullanırdım, ancak 'attrgetter' küçük bir performans avantajına sahip olabilir. Bu zamana ihtiyacın var ve bunun gerçekten sıkı bir döngüde olup olmadığını görmelisin. – mgilson

+1

Bu örnekte liste kavrama ve jeneratör ifadesi arasındaki fark nedir? Bunun üzerine tuple() çağrılıyor? Formdan bağımsız olarak aynı hafıza alanını kullanmaz mı? – Octipi

İlgili konular