は、真の「タプルの内包表記は」存在しないことが述べられています。代わりに、私たちの現在のオプションは、ジェネレータ式を使用して、タプルのコンストラクタに結果ジェネレータオブジェクトを渡すことです。また「タプル内包」とスタースプラット/アンパック演算子*
tuple(thing for thing in things)
、我々はリストの内包表記を使用してリストを作成し、タプルのコンストラクタにリストを渡すことができます。
最後tuple([thing for thing in things])
と受け入れ答えのそれとは反対に、a more recent answerはタプルの内包表記が実際に次の構文を使用して(Pythonの3.5以降)のものであることを述べた:
*(thing for thing in things),
私にとっては、第2の例も、ジェネレータオブジェクトが最初に作成される例であるようです。これは正しいです?
舞台裏でこれらの表現に違いはありますか?パフォーマンス面では?私は第1と第3がレイテンシの問題を抱えているのに対し、第2と第3はメモリの問題があると考えています(リンクされたコメントで議論されているように)。
- 最初のものと最後のものを比較すると、どれが1つのピジョンが多いのですか?
更新:予想通り
、リストの内包が実際にはるかに高速です。私はなぜ最初のものが第3のものよりも速いのか理解していない。何かご意見は?私に
>>> from timeit import timeit
>>> a = 'tuple(i for i in range(10000))'
>>> b = 'tuple([i for i in range(10000)])'
>>> c = '*(i for i in range(10000)),'
>>> print('A:', timeit(a, number=1000000))
>>> print('B:', timeit(b, number=1000000))
>>> print('C:', timeit(c, number=1000000))
A: 438.98362647295824
B: 271.7554752581845
C: 455.59842588083677
パフォーマンスについてお尋ねします。それらをテストしてください。 ipythonで '%timeit'を試してください。あなたの特定のマシンでどれが良いかを調べてください。 –
リスト内包の 'x for y in z'はジェネレータのように見えるかもしれませんが、そうではありません。内部の仕組みは異なっています。例えば。 'x'部分で生成された' StopIteration'はジェネレータを停止しますが、リストの理解からバブルします。 – schwobaseggl
タプルは一般的に、静的に知られている可能性のある異種のアイテムのセット(これは、例えば、上に配置することができます)を表現するために使用され、各位置に関連する意味的意味があるため、どちらも非常にpythonicではないと思います。リストは、反復のような操作が意味を成す、不確定で均質な多数に適しています。それはちょうど私の意見です。 –