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
(+ 1) Teknik olarak, bu bir liste anlama değil (ama emin değilim OP umurunda :) :) – NPE
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
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