Первый кажется мне более читабельным, и он также будет работать в разных версиях 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