gpt4 book ai didi

Python 溢出错误 : iter index too large

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:01 24 4
gpt4 key购买 nike

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

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

我收到一个“OverflowError:iter index too large”。我尝试使用非常大的 iter 数字(例如搜索文件中的数十亿个值)。 iter 范围是否以某种方式限制在 for 循环中?

使用 Python 2.7 64 位。谢谢。

最佳答案

看起来 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 上, C long 即使在 64 位构建上也保持 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 ,这意味着它不会出错,直到索引到达 2**63 - 1 在任何 64 位版本上,Windows 或其他)

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

关于Python 溢出错误 : iter index too large,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39470012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com