2013-12-11 5 views
1

У меня есть большой список строк, и я хочу повторить этот список. Я хочу выяснить, какой из них лучше всего перебирать по списку. Я попытался с помощью следующих способов:, который быстрее и эффективнее между выражением генератора или itertools.chain для итерации по большому списку?

  • Генератор Expression: g = (x for x in list)

  • itertools.chain: ch = itertools.chain(list)

Есть другой подход, лучше, чем эти два, для списка итерации ?

+1

'itertools.chain (list)' бессмысленно. Функция спроектирована двумя целыми двумя или более итераторами, применяя ее только к одному, просто дает вам ничего, кроме ненужного уровня косвенности. –

+0

Как и с любыми вопросами производительности: Измерьте, не угадывайте. Модуль «timeit» - ваш друг: http://docs.python.org/2/library/timeit.html –

+1

Я был готов отправить сообщение «itertools.chain, но это не имеет значения, если это не узкое место», когда Я видел название, но оба варианта здесь просто глупы. Если вам действительно нужен итератор вместо прямого использования списка, 'iter (list)' является лучшим вариантом, но 'для элемента в списке', вероятно, все, что вам нужно. (Кроме того, не вызывайте переменные 'list'. Вы получите странные ошибки при попытке вызвать' list (something) '.) – user2357112

ответ

8

Самый быстрый способ - только перебрать по списку. Если у вас уже есть список, наложение большего количества итераторов/генераторов не ускорит что-либо.

Хороший старый 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() потребляет их, тем самым экономя память.