【问题标题】:python for loop range(bigint)python for循环范围(bigint)
【发布时间】:2010-07-01 06:10:48
【问题描述】:

在 Python 中,是否有一些 short 方法来做类似的事情

"for i in range(n)"

当 n 太大而 Python 无法实际创建数组 range(n) 时?

(很短,否则我只会使用 while 循环)

【问题讨论】:

    标签: python


    【解决方案1】:

    你可以使用xrange()...虽然是限制在CPython中的“短”整数:

    CPython 实现细节: xrange() 旨在简单和 快速地。实施可能会强加 实现这一目标的限制。 C Python 的实现限制了所有 本机 C 长的参数(“短” Python 整数),并且还需要 元素的数量适合 本机 C 长。如果更大的范围是 需要,一个替代版本可以是 使用 itertools 模块制作: takewhile(lambda x: x<stop, (start+i*step for i in count())).

    我不知道该限制是否也适用于其他实现(或哪些实现) - 但列出了一种解决方法...

    我知道您在问题标题中提到了bigint,但问题正文谈到数字太大而无法创建数组 - 我怀疑有很多数字小到足以让xrange 工作,但是range 大到足以让你记忆犹新。

    【讨论】:

    • ...或使用 Python 3,其中 range 的行为类似于 Python 2 中的 xrange,但没有“短”整数的限制...
    • 正如我刚刚从stackoverflow.com/questions/94935/… 了解到的那样,xrange 对 C 长整数有限制,因此上限不能大于 2 ** 31 - 1。
    • @jellybean:或 2**63-1 在 64 位(非 Windows)机器上。 :)
    【解决方案2】:

    我会使用生成器函数:示例即将发布。

    def gen():
        i = 0
        while 1: # or your special terminating logic
            yield i
            i = i + 1
    
    
    for j in gen():
        do stuff
    

    【讨论】:

    • 另外,@Jon Skeet 建议使用 xrange 是一个不错的选择。
    • 没有必要重新发明轮子——至少我是这么想的,直到我读到了 xrange 的限制。因此,如果您使用的是 Python 2,这是一个不错的选择。
    • 同意,@Tim。 :) 除非你想超出 xrange 的限制。
    【解决方案3】:

    您可以升级到 python3。在那里,范围不限于“短”整数。

    另一种解决方法是将 xrange 用于小整数并将它们添加到循环内的某个常量中,例如

    offset, upperlimit = 2**65, 2**65+100
    for i in xrange(upperlimit-offset):
        j = i + offset
        # ... do something with j
    

    【讨论】:

      【解决方案4】:

      您应该始终使用 xrange 而不是 range 来循环 n 次,但请记住 xrange 也有限制(如果它太小,您需要使用计数器执行自己的 while 循环)

      编辑:太晚了...

      【讨论】:

        猜你喜欢
        • 2018-12-20
        • 2022-12-16
        • 2023-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 1970-01-01
        相关资源
        最近更新 更多