Вопрос по iteration, python-2.7, python, list-comprehension – диапазон (len (список)) или перечислить (список)? [Дубликат]

18

Possible Duplicate:
Only index needed: enumerate or (x)range?

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

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

или же

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

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

@InbarRose - 2,7 Benjamin Hodgson♦
какую версию Python вы используете? Inbar Rose

Ваш Ответ

4   ответа
21

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

Я бы предпочелreadable code firstзатем с помощьюxrange() если доступно (то есть, Pre-Python v 3.x) с последующимrange() а такжеenumerate().

Перечисление происходит быстрее, если вы хотите повторно получить доступ к элементам списка по их индексу. Когда вы просто хотите получить список индексов, быстрее использовать len () и range / xrange.
1

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

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

5

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

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

Это не объект-генератор (то есть чистый код Python сyield в своем теле), но это эквивалентно тому, что реализовано в C..next() метод, который возвращает следующее значение или вызывает StopIteration, иfor цикл вызывает это.next() метод неоднократно. (Пожалуйста, оцените мой ответ, если вы найдете его полезным.)
Являетсяxrange объект генератора?documentation не упоминает об этом слове, хотя ваше описание звучит так, как оно есть. Benjamin Hodgson♦
0

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

Похожие вопросы