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位.谢谢.
看起来tekstowe是仅实现一个序列类型__getitem__,而不是__iter__,所以它的使用Python迭代包装调用__getitem__与0,则1,2,3,等等,直到__getitem__加注IndexError.
作为一个实现细节,Python 2.7.11及更高版本限制了迭代器包装器传递的索引的值LONG_MAX(在2.7.11之前,它没有被检查边界但它仍然用于long索引存储,所以它将包装并启动用负值索引).这不会对大多数非Windows 64位建立关系,这里LONG_MAX是2**63 - 1(大于你很可能遇到),但在Windows,C longS保持存储32倍的量即使在64位版本,因此LONG_MAX遗体2**31 - 1,这是足够低,以在人类时间表中达成.
你的选择是:
tekstowe是为了给它一个真正的__iter__方法,所以当你使用它时它不会被序列迭代器包装器包裹size_t,测试PY_SSIZE_T_MAX,这意味着它将不会出错,直到索引到达2**63 - 1任何64位构建,Windows或其他方式)添加溢出检查的更改是为了解决Python错误#22939 ; 序列迭代器的索引存储发生在3.4.0版本中的类型更改(从long到Py_ssize_t),解决了Python错误#17932.