Подтвердить что ты не робот

Насколько велика может быть входная функция input()?

Насколько велика возможность ввода, которую я подаю в функцию input()?

К сожалению, не было простого способа проверить его. После использования большого количества копий я не смог получить input для отказа на любом введенном мной входе. (и я в конце концов сдался)

документация для функции input ничего не говорит об этом:

Если присутствует аргумент prompt, он записывается в стандартный вывод без конечной новой строки. Затем функция считывает строку из ввода, преобразует ее в строку (зачищая конечную новую строку) и возвращает ее. Когда EOF считывается, EOFError поднимается.

Итак, я предполагаю, что нет предела? Кто-нибудь знает, есть ли, и если да, то сколько это?

4b9b3361

Ответ 1

Конечно, есть, он не может быть безграничным *. Ключевое предложение из документации, которая, как мне кажется, нуждается в подсветке, заключается в следующем:

[...] Затем функция считывает строку с ввода, преобразует ее в строку (удаляя конечную новую строку) [...]

(акцент мой)

Поскольку он преобразует введенный вами вход в объект 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 бит int на машинах с 32/64 бит соответственно. Итак, это жесткий предел того, что кажется.

(как указано в сообщении об ошибке, int и intex-size integer - две разные вещи)

Похоже, input() явно проверяет, если введенный вход больше PY_SSIZE_T_MAX (максимальный размер Py_ssize_t) перед преобразованием:

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

Затем он преобразует ввод в Python str с PyUnicode_Decode.


Сделать это в перспективе для вас; если средняя книга длиннее 500.000, а оценка для общего количества книг составляет около 130 миллионов, теоретически можно было бы input вокруг:

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

раз эти символы; это, вероятно, займет у вас некоторое время, хотя:-) (и вы сначала будете ограничены доступной памятью!)

Ответ 2

Мы можем найти ответ экспериментально довольно легко. Сделайте два файла:

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. Вы можете узнать ценность для себя в соответствии с вашим определением того, что приемлемо с точки зрения времени и памяти.