【问题标题】:python simple iterationpython简单迭代
【发布时间】:2011-05-25 02:07:12
【问题描述】:

我想问一下进行简单迭代的最佳方法是什么。假设我想重复某项任务 1000 次,以下哪一项是最好的?还是有更好的方法?

for i in range(1000):
    do something with no reference to i

i = 0
while i < 1000:
    do something with no reference to i
    i += 1

非常感谢

【问题讨论】:

  • 我更喜欢第一个...我相信这只是个人品味的问题
  • 第一个比较地道。
  • “以下哪一项是最好的”? 所说的“最好”是什么意思?请定义“最佳”。如果没有“最佳”的定义,其中任何一个都可能会更好。事实上,还有更多的方法可以做到这一点,这取决于你对“最佳”的定义——可能是最好的。请定义“最佳”。
  • 哦,我有没有提到,请定义最佳。

标签: python iteration


【解决方案1】:

第一个被认为是惯用的。在 Python 2.x 中,使用 xrange 而不是 range

【讨论】:

  • +1 for xrange,具有几乎完全相同的性能特征(至少在 CPython 实现中)。
  • 是 xrange() 总是比 range() 好?什么时候应该使用 range() 而不是 xrange()?
  • 在 2.x 中,range() 提前创建数字列表,对其进行迭代,然后将其丢弃。 xrange()(3.x 中的range())创建了一个特殊的“生成器”对象,可以按需返回数字,这样效率更高。在 3.x 中,如果你真的想要这个列表,你必须要求它:例如list(xrange(10)) 将使用列表构造函数从生成器返回的值中创建一个列表。
  • 另见我对数字的回答
【解决方案2】:

for 循环更简洁易读。 Python 中很少使用 while 循环(while True 除外)。

一点惯用的 Python:如果您尝试在一个范围内执行一定次数的操作(无需使用计数器),最好将计数器命名为 _。示例:

for _ in range(1000):
    # do something 1000 times

【讨论】:

  • 就我个人而言,我永远不会使用_ 循环,但总是使用ijk。在交互式控制台中,_ 是前面的结果,而在程序中,_ 经常用于 i18n(比在其他语言中少得多,因为 _ 被视为更多地被视为一次性变量在 Python 中)。
  • @Chris 同意交互式解释器。至于本地化,我从未见过任何语言。
  • 没见过_('string')?这是 gettext 的常见使用模式。
  • @Chris nope,或者我从未注意到它
【解决方案3】:

在 Python 2 中,使用

for i in xrange(1000):
    pass

在 Python 3 中,使用

for i in range(1000):
    pass

Python 2.6 的性能数据:

$ python -s -m timeit '' 'i = 0
> while i < 1000:
>     i += 1'
10000 loops, best of 3: 71.1 usec per loop

$ python -s -m timeit '' 'for i in range(1000): pass'
10000 loops, best of 3: 28.8 usec per loop

$ python -s -m timeit '' 'for i in xrange(1000): pass'
10000 loops, best of 3: 21.9 usec per loop

在这种情况下xrangerange 更可取,因为它生成一个生成器而不是整个列表[0, 1, 2, ..., 998, 999]。它也会使用更少的内存。如果您需要同时使用实际列表,那么您可以使用range。通常你想要xrange:这就是为什么在Python 3中,xrange(...)变成range(...)range(...)变成list(range(...))

【讨论】:

  • 在我的系统上,range 继续或多或少地线性执行到大约 130,000 个元素左右,然后在时间/循环/迭代上大幅跳跃,并且继续变得更糟。 xrange 至少有一亿个元素是不可阻挡的,我只希望它在 2-40 亿大关附近开始出现任何类型的放缓。 ;)
【解决方案4】:

首先。因为整数是在内部层而不是解释器中完成的。也少了一个全局变量。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 2021-11-15
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多