Что происходит быстрее, цикл for использует перечисление или использование xrange?
EDIT: Я тестировал, и я просто вижу минимальные различия.
Что происходит быстрее, цикл for использует перечисление или использование xrange?
EDIT: Я тестировал, и я просто вижу минимальные различия.
Перечисление немного быстрее. Протестировано в 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
Если a не будет списком, а генератором, то будет значительно быстрее использовать перечисление (74 мс с использованием диапазона, 23 мс с использованием перечисления).
Вы можете использовать модуль timeit в стандартной библиотеке для сравнения обоих. Функция timeit.timeit(), используемая ниже, принимает утверждение о том, что она выполняется 1'000'000 раз и возвращает общее время в секундах. В этом тесте перечисление() немного медленнее.
>>> 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
Mu.
Для циклов можно одновременно использовать как перечисление, так и xrange, хотя это было бы глупо. Функция перечисления добавляет индекс, чтобы вы могли указать, что такое индекс элемента в вашем итерабельном. Функция xrange возвращает итерируемый набор чисел. Используйте его, если вы хотите сделать что-то определенное количество раз, а не для каждого элемента в итерабельном.
Примеры:
for idx, element in ['foo', 'bar', 'baz']:
print idx, element
for idx in xrange(3):
print idx