Что быстрее для цикла с использованием перечисления или для цикла с использованием xrange в Python? - PullRequest
3 голосов
/ 31 января 2011

Что быстрее, цикл for, использующий перечисление или использование xrange?

РЕДАКТИРОВАТЬ: я проверил, и я просто вижу минимальные различия.

Ответы [ 3 ]

5 голосов
/ 31 января 2011

Вы можете использовать модуль timeit в стандартной библиотеке для сравнения обоих.Функция timeit.timeit (), используемая ниже, принимает оператор, который выполняется 1 000 000 раз, и возвращает общее время в секундах.В этом тесте enumerate () немного медленнее.

>>> import timeit
>>> timeit.timeit('for i in xrange(100): a[i]', 'a = list(xrange(100))')
7.2920000553131104
>>> timeit.timeit('for i, o in enumerate(a): o', 'a = list(xrange(100))')
10.359999895095825
>>> timeit.timeit('for i in xrange(100): a[i] + 1', 'a = list(xrange(100))')
10.380000114440918
>>> timeit.timeit('for i, o in enumerate(a): o + 1', 'a = list(xrange(100))')
13.514999866485596
5 голосов
/ 31 января 2011

Перечислять немного быстрее. Протестировано в Python 3:

>>>import pygame
>>>pygame.init()
>>>clock = pygame.time.Clock()
>>>a = list(range(100000))
>>>def do_with_range():
...    clock.tick()
...    k = 0
...    for i in range(len(a)):
...        k += a[i]
...    print(clock.tick())
>>>def do_with_enumerate():
...    clock.tick()
...    k = 0
...    for i, j in enumerate(a):
...        k += j
...    print(clock.tick())
>>>do_with_range()
23
>>>do_with_enumerate()
21

Если бы не список, а генератор, было бы значительно быстрее использовать перечисление (74 мс с использованием диапазона, 23 мс с использованием перечисления).

0 голосов
/ 31 января 2011

Mu .

Для циклов можно использовать как перечисление, так и xrange одновременно, хотя это было бы глупо. Функция enumerate добавляет индекс, чтобы вы могли определить, каков индекс элемента в вашей итерации. Функция xrange возвращает итерацию, полную цифр. Используйте его, когда вы хотите сделать что-то определенное количество раз, а не для каждого элемента итерируемого.

Примеры:

for idx, element in ['foo', 'bar', 'baz']:
    print idx, element

for idx in xrange(3):
    print idx
...