use*_*416 33 python string function python-3.x python-internals
我为该input()功能提供的输入有多大?
不幸的是,没有简单的方法来测试它.在使用了大量的复制粘贴之后,我input无法在我提供的任何输入上失败.(我最终放弃了)
该文档的input功能,并没有提及关于这样的东西:
如果
prompt参数存在,则将其写入标准输出而不带尾随换行符.然后,该函数从输入中读取一行,将其转换为字符串(剥离尾部换行符),然后返回该行.读取EOF时,EOFError会引发.
那么,我猜是没有限制的?有没有人知道是否有,如果有,多少钱?
Jim*_*ard 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
Run Code Online (Sandbox Code Playgroud)
(尝试前面的2 ** 63 - 1,这是正的可接受限制,-2 ** 63是负限制.)
对于索引,不是内部使用的Python数字; 相反,它是Py_ssize_t分别在32/64位机器上签名的32/64位int.所以,这是它看起来的硬限制.
(作为错误消息状态,int和intex大小的整数是两个不同的东西)
在转换之前,它似乎也input()明确检查提供的输入是否大于PY_SSIZE_T_MAX(最大大小Py_ssize_t):
if (len > PY_SSIZE_T_MAX) {
PyErr_SetString(PyExc_OverflowError,
"input: input too long");
result = NULL;
}
Run Code Online (Sandbox Code Playgroud)
然后,它把输入到一个Python str用PyUnicode_Decode.
把它放在你的角度; 如果平均书籍的500.000字符很长,而且书籍总数估计在1.3亿左右,那么理论上你可以input在:
>>> ((2 ** 63) - 1) // 500000 * 130000000
141898
Run Code Online (Sandbox Code Playgroud)
那些人物; 它可能需要一些时间,但是:-)(并且你首先受到可用内存的限制!)
Ale*_*all 13
我们可以很容易地通过实验找到答案.制作两个文件:
make_lines.py:
num_lines = 34
if __name__ == '__main__':
for i in range(num_lines):
print('a' * (2 ** i))
Run Code Online (Sandbox Code Playgroud)
read_input.py:
from make_lines import num_lines
for i in range(num_lines):
print(len(input()))
Run Code Online (Sandbox Code Playgroud)
然后在Linux或OSX中运行此命令(我不知道Windows等价物):
python make_lines.py | python3 read_input.py
Run Code Online (Sandbox Code Playgroud)
在我的计算机上,它设法完成但最终挣扎,显着减慢其他进程.它打印的最后一件事8589934592,即8 GiB.您可以根据您在时间和内存限制方面可接受的定义来找出自己的价值.
| 归档时间: |
|
| 查看次数: |
2768 次 |
| 最近记录: |