42
リストの理解を使用してリストから2タプルのタプルを構築する方法を教えてください。それはgenerator expressionだ、リストの理解を使用してタプルを作成する
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
リストの理解を使用してリストから2タプルのタプルを構築する方法を教えてください。それはgenerator expressionだ、リストの理解を使用してタプルを作成する
tup =()
for element in alist:
tup = tup + ((element.foo, element.bar),)
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
(+ 1)技術的に指摘する価値があるかもしれませんが、これはリストの理解ではありません(しかし、私はOPは気にしません:)) – NPE
you coulまた、 'tuple(map(operator.attrgetter( 'foo'、 'bar')、alist))'を実行します。投稿したものを読みやすくするために使用していますが、attrgetterには少しのパフォーマンス上の利点があります。これは本当にタイトなループであるかどうかを 'timeit'して調べる必要があります。 – mgilson
この例のリスト理解とジェネレータ式の違いは、tuple()が呼び出されてからです。フォームに関係なく同じメモリフットプリントを消費しませんか? – Octipi