【问题标题】:Python Overflow Error: iter index too largePython 溢出错误:iter 索引太大
【发布时间】:2017-01-21 01:17:49
【问题描述】:

我在下面的代码中遇到了 for 循环中的大迭代器的问题。它通过读取包含数字的字符串列表来生成浮点数。

def float_generator(tekstowe):
        x = ''
        for c in tekstowe:
            if c != ' ':
                x += c
            else:
                out = float(x)
                x = ''
                yield(out)

我收到 “溢出错误:iter 索引太大”。我尝试使用非常大的迭代数(例如搜索文件中的数十亿个值)。 iter 范围是否以某种方式限制在 for 循环中?

使用 Python 2.7 64 位。谢谢。

【问题讨论】:

标签: python loops iterator


【解决方案1】:

看起来tekstowe是一个只实现__getitem__而不是__iter__的序列类型,所以它使用Python迭代器包装器调用__getitem__,依次为0、1、2、3等,直到__getitem__ 提高 IndexError

作为一个实现细节,Python 2.7.11 and higher limits the value of the index passed by the iterator wrapper to LONG_MAX(在 2.7.11 之前,它没有进行边界检查,但它仍然使用long 进行索引存储,因此它会包装并开始使用负值进行索引)。这对大多数非 Windows 64 位版本无关紧要,其中 LONG_MAX2**63 - 1(比您可能遇到的要大),但在 Windows 上,即使在 64 位版本上,C longs 仍然是 32 位数量,所以LONG_MAX 仍然是2**31 - 1,这在人类时间尺度上已经足够低了。

您的选择是:

  1. 更改任何类 tekstowe 的实现是为了给它一个真正的 __iter__ 方法,所以当你使用它时它不会被序列迭代器包装器包装
  2. 升级到 Python 3.4+,最好是 3.5(2.7.10/3.4.3 及以下lacks the check for overflow entirely,但这可能意味着环绕会导致无限循环;3.4.4/3.5.0 added the check, and they use a signed size_t, testing against PY_SSIZE_T_MAX,这意味着它不会出错,直到索引达到@987654343 @ 在任何 64 位版本上,Windows 或其他)

添加溢出检查的更改是为了解决Python bug #22939;序列迭代器的索引存储的类型更改(从 longPy_ssize_t)发生在 3.4.0 版本中,解决了 Python bug #17932

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多