"Compreensões de tuplas" e o operador estrela splat / desempacotamento *

Acabei de ler a perguntaPor que não há compreensão de tupla no Python?

Nocomentários da resposta aceita, afirma-se que não existem "compreensões de tupla" verdadeiras. Em vez disso, nossa opção atual é usar uma expressão de gerador e passar o objeto gerador resultante para o construtor de tupla:

tuple(thing for thing in things)

Como alternativa, podemos criar uma lista usando uma compreensão da lista e depois passar a lista para o construtor de tupla:

tuple([thing for thing in things])

Por fim, e ao contrário da resposta aceita,uma resposta mais recente afirmou que as compreensões da tupla são realmente uma coisa (desde Python 3.5) usando a seguinte sintaxe:

*(thing for thing in things),

Para mim, parece que o segundo exemplo também é aquele em que um objeto gerador é criado primeiro. Isso está correto?

Existe alguma diferença entre essas expressões em termos do que acontece nos bastidores? Em termos de desempenho? Presumo que o primeiro e o terceiro possam ter problemas de latência, enquanto o segundo pode ter problemas de memória (conforme discutido nos comentários vinculados).

Comparando o primeiro e o último, qual é mais pitônico?

Atualizar:

Como esperado, a compreensão da lista é realmente muito mais rápida. Eu não entendo porque o primeiro é mais rápido que o terceiro. Alguma ideia?

>>> 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

questionAnswers(1)

yourAnswerToTheQuestion