В дополнении к преимуществу скорости, 1 является «чище выглядящим», но и будет работать для последовательностей, которые не поддерживают Len, а именно выражение генератора и результаты функций генератора. Чтобы использовать решение 2, вам сначала нужно будет преобразовать генератор в список, чтобы получить его длину , если бы вы могли. Но что, если генератор генерирует список всех простых чисел, а doSomething ищет первое значение> 100?
for num in prime_number_generator():
if num > 100: return num
Невозможно преобразовать это во вторую форму, поскольку этот генератор не имеет конца.
Кроме того, что, если очень дорого создавать элементы списка (как при извлечении из базы данных или удаленного веб-сервера)? Если вы ищете подходящее значение из сгенерированного набора значений N, с # 1 вы можете выйти, как только найдете совпадение, и избегать в среднем генерации значений N/2. Чтобы использовать # 2, сначала нужно сгенерировать все значения N, чтобы получить длину, чтобы сделать диапазон.
Существует причина, по которой Python 3 преобразовал многие встроенные функции, чтобы возвращать итераторы вместо списков - они более гибкие.
What is Pythonic?
"for i in range(len(seq)):"? No.
Use "for x in seq:"
Вы можете проверить его сами;). И да 1 быстрее. –
Для 2, для каждого i вы можете рассчитать длину списка. Сначала быстрее –
Ваше предположение, скорее всего, верно по причинам, которые вы, вероятно, догадались, - он может оптимизировать поиск элементов в коде C.В обоих случаях вы вызываете 'next' на собственный объект, так что это должно быть довольно быстро в любом случае (хотя xrange все равно может потребоваться больше вычислений для обработки начала, остановки и шага и т. Д.) ... но в последнем случае случае, вам необходимо выполнить дополнительный шаг _indexing_ объекта, который вам не нужно было делать раньше. – mgilson