【问题标题】:What is faster for loop using enumerate or for loop using xrange in Python?在 Python 中使用 enumerate 的 for 循环或使用 xrange 的 for 循环哪个更快?
【发布时间】:2011-06-18 16:27:02
【问题描述】:

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

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

【问题讨论】:

  • 它们并不是真正可以互换的。你想做什么?你能粘贴代码示例吗?
  • 为什么不测试它(after determining that it matters)?
  • 哇,在这里投反对票。让我们等待一个改进的问题。也许发帖人需要回答为什么这个问题很难回答……让我们更加欢迎这位新用户,并在他的第一篇文章中帮助他。
  • @Adam:如果您想在迭代时方便地使用索引变量,它们就是。
  • @Jochen:高辛烷值汽油会让一些汽车跑得更快,使用正确的混合气可能比购买不同的汽车便宜得多。至于这个问题,我认为问哪个更快是完全合理的。有时像这样的小事情会对代码的性能关键部分产生很大的影响。例如,在 JavaScript 中,选择正确的循环结构可以生成 huge difference

标签: python loops xrange


【解决方案1】:

您可以使用标准库中的 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

【讨论】:

  • 在我的测试中枚举速度更快,python 3.6
【解决方案2】:

Mu.

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

例子:

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

for idx in xrange(3):
    print idx

【讨论】:

    【解决方案3】:

    枚举稍微快一些。在 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)。

    【讨论】:

    • 问题实际上是在问xrange,而不是range
    • 在 Python 3 中,xrange 被 range 取代, range 现在是一个生成器。这也是我手动执行 list(range()) 的原因。因此,在 Python 2 中使用 xrange 的结果将是相似的。
    • 好的,我也在 Python 2 中对其进行了测试。由于不明原因,Python 2 比 Python 3 快得多,并且 xrange 和 enumerate 版本的速度相同:14ms。 (难道不应该期望该语言的更高版本比以前的版本更快吗?但是好吧......)。
    • 然而,使用你增加的本地而不是这些方法中的任何一种仍然更快。枚举 Pythonic 方式,但解包元组比递增局部变量要慢,因此它可能总是会更慢(尽管只有一点点)。
    • @Nick:更不用说这种差异会很荒谬,即使很明显,即使是明显的差异也不能证明额外的代码和丑陋,除非可能在一个内部循环中(你应该如果速度很重要,只需用 Cython 编写)。
    猜你喜欢
    • 2016-02-18
    • 2014-01-02
    • 2011-06-13
    • 2016-05-30
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多