Первый кажется мне более читабельным, и он также будет работать в разных версиях Python.

сто прочитал вопросПочему в Python нет понимания кортежей?

вкомментарии принятого ответаУтверждается, что истинных «кортежных пониманий» не существует. Вместо этого, наша текущая опция - использовать выражение генератора и передать полученный объект генератора в конструктор кортежей:

tuple(thing for thing in things)

В качестве альтернативы, мы можем создать список, используя понимание списка, а затем передать список конструктору кортежей:

tuple([thing for thing in things])

Наконец, и наоборот принятого ответа,более свежий ответ заявил, что понимание кортежей действительно вещь (начиная с Python 3.5), используя следующий синтаксис:

*(thing for thing in things),

Мне кажется, что второй пример также является тем, где сначала создается объект генератора. Это верно?

Есть ли разница между этими выражениями с точки зрения того, что происходит за кулисами? С точки зрения производительности? Я предполагаю, что у первого и третьего могут быть проблемы с задержкой, а у второго могут быть проблемы с памятью (как обсуждается в связанных комментариях).

Сравнивая первое и последнее, какой из них более питонический?

Обновить:

Как и ожидалось, понимание списка действительно намного быстрее. Однако я не понимаю, почему первый быстрее третьего. есть идеи?

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

Ответы на вопрос(1)

Ваш ответ на вопрос