2013-03-14 11 views

答えて

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

技術的に相当します。これはリストの理解のようなものですが、遅れて評価され、中間リストにメモリを割り当てる必要はありません。

完全を期すため、リスト内包表記は次のようになります。

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

 

PS:attrgetterが速くなっていません(alistはここに百万の項目があります):

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)技術的に指摘する価値があるかもしれませんが、これはリストの理解ではありません(しかし、私はOPは気にしません:)) – NPE

+2

you coulまた、 'tuple(map(operator.attrgetter( 'foo'、 'bar')、alist))'を実行します。投稿したものを読みやすくするために使用していますが、attrgetterには少しのパフォーマンス上の利点があります。これは本当にタイトなループであるかどうかを 'timeit'して調べる必要があります。 – mgilson

+1

この例のリスト理解とジェネレータ式の違いは、tuple()が呼び出されてからです。フォームに関係なく同じメモリフットプリントを消費しませんか? – Octipi

関連する問題