enumerateまたはxrangeを使用したforループの方が高速ですか?
編集:私はテストしました、そして私はほんのわずかな違いを見ます。
列挙はわずかに高速です。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ミリ秒)。
You can use the timeit module in the standard library to compare both. The timeit.timeit() function used below takes a statement that it runs 1'000'000 times and returns the total time in seconds. In this test enumerate() is slightly slower.
>>> 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
ムー。
forループでは、enumerateとxrangeの両方を同時に使用できますが、ばかげています。enumerate関数はインデックスを追加するので、反復可能オブジェクト内のアイテムのインデックスが何であるかを知ることができます。xrange関数は、反復可能な数値でいっぱいを返します。iterableの各要素ではなく、特定の回数だけ何かを実行したい場合に使用します。
例:
for idx, element in ['foo', 'bar', 'baz']:
print idx, element
for idx in xrange(3):
print idx