Python溢出错误:iter索引太大

Kon*_*Gje 3 python iterator loops

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

def float_generator(tekstowe):
        x = ''
        for c in tekstowe:
            if c != ' ':
                x += c
            else:
                out = float(x)
                x = ''
                yield(out)
Run Code Online (Sandbox Code Playgroud)

我得到一个"OverflowError:iter index太大".我尝试使用非常大的数字(如搜索文件中的数十亿个值).它的范围在某种程度上限制了for循环吗?

使用Python 2.7 64位.谢谢.

Sha*_*ger 6

看起来tekstowe是仅实现一个序列类型__getitem__,而不是__iter__,所以它的使用Python迭代包装调用__getitem__与0,则1,2,3,等等,直到__getitem__加注IndexError.

作为一个实现细节,Python 2.7.11及更高版本限制了迭代器包装器传递的索引的值LONG_MAX(在2.7.11之前,它没有被检查边界但它仍然用于long索引存储,所以它将包装并启动用负值索引).这不会对大多数非Windows 64位建立关系,这里LONG_MAX2**63 - 1(大于你很可能遇到),但在Windows,C longS保持存储32倍的量即使在64位版本,因此LONG_MAX遗体2**31 - 1,这是足够低,以在人类时间表中达成.

你的选择是:

  1. 更改任何类的实现tekstowe是为了给它一个真正的__iter__方法,所以当你使用它时它不会被序列迭代器包装器包裹
  2. 升级到Python 3.4+,理想情况下3.5(2.7.10/3.4.3及以下版本完全没有检查溢出,但这可能意味着环绕导致无限循环; 3.4.4/3.5.0添加了检查,并且他们使用了签名size_t,测试PY_SSIZE_T_MAX,这意味着它将不会出错,直到索引到达2**63 - 1任何64位构建,Windows或其他方式)

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