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

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

Что из этого будет считаться лучше / понятнее / быстрее / более "питоническим"? Меня не волнует содержание списка Lтолько сколько времени.

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

или же

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

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

4 ответа

Решение

Некоторые быстрые прогоны по времени дают второй вариант, используя 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(),

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

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

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

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

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

Другие вопросы по тегам