"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