Диапазон (len (список)) или перечислить (список)?

Возможный дубликат:
Требуется только индекс: перечислять или (x) диапазон?

Какое из них будет считаться лучше/яснее/быстрее/больше "Pythonic"? Я не забочусь о содержании списка L, насколько он длинный.

a = [f(n) for n, _ in enumerate(L)]

или

a = [f(n) for n in range(len(L))]

Если это имеет значение, функция f также использует len(list).

Ответы

Ответ 1

Некоторые быстрые тайминги, похоже, дают второй вариант с использованием range() небольшого края над enumerate():

timeit a = [f(n) for n, _ in enumerate(mlist)]
10000 loops, best of 3: 118 us per loop

timeit a = [f(n) for n in range(len(mlist))]
10000 loops, best of 3: 102 us per loop

и просто для удовольствия с помощью xrange() (Python v2.7.2)

timeit a = [f(n) for n in xrange(len(mlist))]
10000 loops, best of 3: 99 us per loop

Сначала я хотел бы использовать читаемый код, а затем использовать xrange(), если он доступен (т.е. Pre-Python v 3.x), а затем range() и enumerate().

Ответ 2

Решение диапазона (x) выполняется быстрее, поскольку оно имеет меньше накладных расходов, поэтому я бы использовал это.

В Python 2.x используйте xrange вместо range, потому что xrange использует меньше памяти, потому что он не создает временный список. В Python 3.x существует только range, который является версией с меньшей памятью.

Ответ 3

Предполагая, что вы используете Python 2.x, если вы используете len(), вы должны использовать xrange(), так как это позволит избежать создания списка чисел в диапазоне.

И в этом случае я бы пошел с len(), потому что вы используете индексы, а не элементы в списке.

Ответ 4

Я бы сказал, что, поскольку вы не используете атрибут "_" из функции enumarate, используйте диапазон, поскольку это более читаемо таким образом.