使用枚举的循环或使用Python中的xrange循环的速度更快?

ich*_*igo 4 python loops xrange

什么是更快,使用枚举或使用xrange的for循环?

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

cem*_*r93 5

枚举稍快一些.在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
Run Code Online (Sandbox Code Playgroud)

如果a不是列表,而是生成器,则使用枚举(使用范围为74ms,使用枚举为23ms)会明显更快.

  • 在Python 3中,xrange被范围所取代,而范围现在是一个生成器.这也是我手动填写列表(range())的原因.因此,使用xrange的Python 2中的结果将是类似的. (5认同)
  • 然而,使用您递增的本地方法而不是这些方法中的任何一种方法仍然更快。枚举 * 是 * Pythonic 方式,但解包元组比增加局部变量慢,因此它可能总是更慢(尽管只是略微如此)。 (2认同)

jd.*_*jd. 5

您可以使用标准库中的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
Run Code Online (Sandbox Code Playgroud)