输入()函数的输入有多大?

时间:2016-11-14 21:55:59

标签: python string python-3.x function python-internals

我向input()函数提供的输入有多大?

不幸的是,没有简单的方法来测试它。在使用了大量的复制粘贴后,我无法让input在我提供的任何输入上失败。 (我最终放弃了)

input函数的documentation并未提及任何相关内容:

  

如果存在prompt参数,则将其写入标准输出而不带尾随换行符。然后,该函数从输入中读取一行,将其转换为字符串(剥离尾部换行符),然后返回该行。读取EOF时,会引发EOFError

所以,我猜测没有限制?有没有人知道是否有,如果有,多少钱?

2 个答案:

答案 0 :(得分:29)

当然有,它不能无限*。我认为需要强调的文档中的关键句是:

  

[...]函数然后从输入中读取一行,将其转换为字符串(剥离尾随换行符)[...]

(强调我的)

由于它将您提供的输入转换为 Python str对象,因此它实际上转换为:“其大小 小于或等于最大的字符串Python可以创建“。

没有给出明确大小的原因可能是因为这是一个实现细节。对Python的所有其他实现强制执行最大大小没有多大意义。

*在CPython中,至少,字符串的最大大小受其允许的索引的大小限制(参见PEP 353)。也就是说,当您尝试将其编入索引时,允许括号[]中的数字有多大:

>>> s = ''
>>> s[2 ** 63]

IndexErrorTraceback (most recent call last)
<ipython-input-10-75e9ac36da20> in <module>()
----> 1 s[2 ** 63]

IndexError: cannot fit 'int' into an index-sized integer

(使用2 ** 63 - 1尝试上一个,这是可接受的正面限制,-2 ** 63是负限制。)

对于索引,不是内部使用的Python数字;相反,它是Py_ssize_t,它分别是32/64位机器上的带符号32/64位int。所以,这是看起来的硬限制。

(正如错误消息所述,int和 intex大小的整数是两回事)

如果在转换前提供的输入大于PY_SSIZE_T_MAXPy_ssize_t的最大大小),它似乎也是input() explicitly checks

if (len > PY_SSIZE_T_MAX) {
    PyErr_SetString(PyExc_OverflowError,
                    "input: input too long");
    result = NULL;
}

然后它将输入转换为带有str的Python PyUnicode_Decode

为了你的观点;如果平均图书长度为500.000个字符,并且图书总数的estimation大约为1.3亿,那么理论上你可以input左右:

>>> ((2 ** 63) - 1) // 500000 * 130000000
141898

倍于那些人物;它可能需要你一些时间,但是:-)(并且你首先受到可用内存的限制!)

答案 1 :(得分:13)

我们可以很容易地通过实验找到答案。制作两个文件:

make_lines.py

num_lines = 34

if __name__ == '__main__':
    for i in range(num_lines):
        print('a' * (2 ** i))

read_input.py

from make_lines import num_lines

for i in range(num_lines):
    print(len(input()))

然后在Linux或OSX中运行此命令(我不知道Windows等效项):

python make_lines.py | python3 read_input.py

在我的电脑上,它设法完成但最终挣扎,显着减慢其他进程。它打印的最后一件事是8589934592,即8 GiB。您可以根据您在时间和记忆限制方面可接受的定义来找出自己的价值。

相关问题