title: "Tuple comprehensions" and the star splat/unpack operator *
body: <p>I just read the question <a href="https://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python">Why is there no tuple comprehension in Python?
  </a></p>
  
  <p>In the <a href="https://stackoverflow.com/questions/16940293/why-is-there-no-tuple-comprehension-in-python#comment66240747_16940351">comments of the accepted answer</a>, it is stated that there are no true "tuple comprehensions". Instead, our current option is to use a generator expression and pass the resulting generator object to the tuple constructor:</p>
  
  <pre><code>tuple(thing for thing in things)
  </code></pre>
  
  <p>Alternatively, we can create a list using a list comprehension and then pass the list to the tuple constructor:</p>
  
  <pre><code>tuple([thing for thing in things])
  </code></pre>
  
  <p>Lastly and to the contrary of the accepted answer, <a href="https://stackoverflow.com/a/47476344/6292000">a more recent answer</a> stated that tuple comprehensions are indeed a thing (since Python 3.5) using the following syntax:</p>
  
  <pre><code>*(thing for thing in things),
  </code></pre>
  
  <ul>
  <li><p>To me, it seems like the second example is also one where a generator object is created first. Is this correct? </p></li>
  <li><p>Is there any difference between these expressions in terms of what goes on behind the scenes? In terms of performance? I assume the first and third could have latency issues while the second could have memory issues (as is discussed in the linked comments). </p></li>
  <li>Comparing the first one and the last, which one is more pythonic?</li>
  </ul>
  
  <p><strong>Update:</strong></p>
  
  <p>As expected, the list comprehension is indeed much faster. I don't understand why the first one is faster than the third one however. Any thoughts?</p>
  
  <pre><code>&gt;&gt;&gt; from timeit import timeit
  
  &gt;&gt;&gt; a = 'tuple(i for i in range(10000))'
  &gt;&gt;&gt; b = 'tuple([i for i in range(10000)])'
  &gt;&gt;&gt; c = '*(i for i in range(10000)),'
  
  &gt;&gt;&gt; print('A:', timeit(a, number=1000000))
  &gt;&gt;&gt; print('B:', timeit(b, number=1000000))
  &gt;&gt;&gt; print('C:', timeit(c, number=1000000))
  
  A: 438.98362647295824
  B: 271.7554752581845
  C: 455.59842588083677
  </code></pre>