6

使用 enumerate 或使用 xrange 的 for 循环哪个更快?

编辑:我已经测试过,我只看到最小的差异。

4

3 回答 3

8

枚举稍微快一些。在 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 不是一个列表,而是一个生成器,那么使用 enumerate 会明显更快(使用 range 为 74ms,使用 enumerate 为 23ms)。

于 2011-01-31T16:24:08.547 回答
6

您可以使用标准库中的 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
于 2011-01-31T16:48:44.007 回答
0

for 循环可以同时使用 enumerate 和 xrange ,尽管这很愚蠢。enumerate 函数添加了一个索引,这样您就可以知道您的可迭代项中的项目的索引是什么。xrange 函数返回一个充满数字的可迭代对象。当您想要做某事一定次数时使用它,而不是针对可迭代中的每个元素。

例子:

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

for idx in xrange(3):
    print idx
于 2011-01-31T16:25:37.807 回答