Самый быстрый способ - только перебрать по списку. Если у вас уже есть список, наложение большего количества итераторов/генераторов не ускорит что-либо.
Хороший старый for item in a_list:
будет таким же быстрым, как и любой другой вариант, и определенно более читаемым.
Итераторы и генераторы предназначены, если у вас еще нет списка, сидящего в памяти. Например, itertools.count()
генерирует только одно число за раз; он не работает с существующим списком чисел.
Другое возможное использование - это когда вы цепляете несколько операций - ваши промежуточные шаги могут создавать итераторы/генераторы, а не создавать промежуточные списки. Например, если Вы желаете приковать взгляд вверх для каждого элемента в списке с sum()
вызова, вы можете использовать выражение генератора для выхода из выборок, которые sum()
затем потреблять:
total_inches_of_snow = sum(inches_of_snow(date) for date in list_of_dates)
Это позволяет избежать создания промежуточного списка со всеми отдельными дюймами снега и вместо этого просто генерировать их, поскольку sum()
потребляет их, тем самым экономя память.
'itertools.chain (list)' бессмысленно. Функция спроектирована двумя целыми двумя или более итераторами, применяя ее только к одному, просто дает вам ничего, кроме ненужного уровня косвенности. –
Как и с любыми вопросами производительности: Измерьте, не угадывайте. Модуль «timeit» - ваш друг: http://docs.python.org/2/library/timeit.html –
Я был готов отправить сообщение «itertools.chain, но это не имеет значения, если это не узкое место», когда Я видел название, но оба варианта здесь просто глупы. Если вам действительно нужен итератор вместо прямого использования списка, 'iter (list)' является лучшим вариантом, но 'для элемента в списке', вероятно, все, что вам нужно. (Кроме того, не вызывайте переменные 'list'. Вы получите странные ошибки при попытке вызвать' list (something) '.) – user2357112