Python中使用enumerate的for循环和使用xrange的for循环哪个更快?

9 投票
3 回答
26908 浏览
提问于 2025-04-16 10:56

使用enumerate的for循环和使用xrange的for循环,哪个更快呢?

补充:我测试过,发现它们之间的差别很小。

3 个回答

0

Mu

在编程中,for循环可以同时使用enumerate和xrange,虽然这样做有点傻。enumerate这个函数的作用是给你一个索引,这样你就可以知道在你要处理的列表中某个项目的位子。xrange这个函数则是返回一系列数字的可迭代对象。当你想要做某件事情固定次数时,可以用它,而不是针对列表中的每一个元素。

例子:

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

for idx in xrange(3):
    print idx
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
10

使用enumerate会稍微快一些。在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时需要74毫秒,而使用enumerate只需要23毫秒)。

撰写回答