web-dev-qa-db-ja.com

input()関数への入力はどのくらい大きくできますか?

input()関数への入力はどのくらい大きくできますか?

残念ながら、それをテストする簡単な方法はありませんでした。多くのコピー貼り付けを使用した後、私が提供した入力でinputが失敗することはありませんでした。 (そして私は結局あきらめました)

input関数の documentation は、これについては何も言及していません。

Prompt引数が存在する場合、末尾の改行なしで標準出力に書き込まれます。次に、関数は入力から行を読み取り、それを文字列に変換し(末尾の改行を削除)、それを返します。 EOFが読み込まれると、EOFErrorが発生します。

だから、私は制限がないと思いますか?誰かが存在するかどうか、ある場合はどれくらいかを知っていますか?

33
user6774416

もちろん、それは無制限であってはなりません*。強調表示する必要があると私が思うドキュメントの重要な文章は次のとおりです。

[...]次に、関数は入力から行を読み取り、それを文字列に変換します(末尾の改行を削除します)[...]

(強調鉱山)

提供する入力をPythonstrオブジェクトに変換するため、基本的に次のように変換されます:「そのサイズhas最大文字列以下になるようにするPython can create "".

明示的なサイズが指定されていない理由は、これが実装の詳細であるためと考えられます。 Python)の他のすべての実装に最大サイズを強制しても、あまり意味がありません。

* CPythonでは、少なくとも、文字列の最大サイズは、そのindexが許容される大きさによって制限されます( PEP 35 を参照)。つまり、かっこ内の数値_[]_を、インデックスに登録するときにどの程度の大きさを許可するかです。

_>>> 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内部で使用される数値ではなく、それぞれ32/64ビットマシンの32/64ビットintに署名された_Py_ssize_t_です。だから、それは見た目からのハードリミットです。

(エラーメッセージが示すように、intとintex-size integerは2つの異なるものです)

また、 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 with _PyUnicode_Decode_に変換します。


それをあなたのために展望するために;平均的な本の長さが_500.000_文字で、本の総数の estimation が約1億3,000万である場合、理論的には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。時間とメモリの制限に関して許容できるものの定義に従って、自分自身の値を見つけることができます。

13
Alex Hall