2016-11-14 11 views
31

私はinput()機能に供給する入力の大きさはどれくらいですか?input()関数への入力の大きさはどれくらいですか?

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

input関数のdocumentationは、このに関しては何も言及していない:

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

だから、私は制限がないと思いますか?もしあれば、誰でも知っていますか、もしあれば、どれくらいですか?

+0

関連:http://stackoverflow.com/q/1739913/5647260 – Li357

+1

「*多くのコピー貼り付けを使用した後」* [リダイレクトスタンダード]を試してみましたか(http://stackoverflow.com/a/15680903/1013719)? –

+0

私は@ RyanHainingに感謝していませんでした! – user6774416

答えて

29

もちろん、無限ではありません。私はニーズのハイライトがあると考えているドキュメントからキーセンテンス:

[...]機能は、その後、[(末尾の改行をストリッピング)は、文字列に変換し、入力から行を読み込み... ]

(強調鉱山)

それはにユーザーが指定する入力を変換するためのPythonstrオブジェクトは、本質的に変換:「は、そのサイズがPythonが作成できる最大の文字列以下である必要があります。 "

明示的なサイズが指定されていない理由は、これが実装の詳細なのかもしれないからでしょう。 Pythonの他のすべての実装に最大サイズを適用することはあまり意味がありません。

*少なくとも、文字列の最大サイズは、のインデックスがどれくらい大きいかによって制限されます(PEP 353参照)。 (つまり、正の許容限度、-2 ** 63が負の限界でだ、2 ** 63 - 1と前回を試してみてください。)

>>> 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 

:それはあなたがそれを試してみて、インデックス時にカッコ[]内の数字があることを許可されてどのように大きな、あります

インデックスの場合、内部的に使用されるのはPython番号ではありません。代わりに、それはそれぞれ32/64ビットマシン上で符号付き32/64ビット整数であるPy_ssize_tです。それは、それが見えるものからの厳しい限界です。

(エラーメッセージ状態、INTとインテックスサイズの整数は、2つの異なるものであるように)

供給された入力が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; 
} 

が、それはPyUnicode_DecodeとPythonのstrに入力を変換します。


あなたのためにそれを視点に入れます。平均本は500.000文字の長さや書籍の合計数のestimationは約1.3億である、あなたは理論的には周りのinputできれば:

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

回これらの文字。しかし、おそらくあなたには時間がかかります:-)(利用可能なメモリによって制限されることがあります)

+5

[文字列の長さはどれくらいですか](https://en.wiktionary.org/wiki/how_long_is_a_piece_of_string) – wim

+0

私はこれをインタラクティブセッション(linux xterm)で試して、非常に奇妙な反応を得ました(貼り付け後マウスの中ボタンを使用して約30kの文字)、文字列の非常に遅いプリント(1行/秒)のように見えます。おそらくPythonの問題ではないでしょうが、readline/xtermの速度が遅くなったり、これを引き起こしている別の考えがありますか? – mkiever

+0

私はあなたに同意します、それがPythonsの欠陥であることを意味しません。 30k文字のダンプをスムーズに処理するために構築されたインタラクティブセッションは本当に疑問ですが、もう一度それらを調べていません。 –

13

私たちは、実験的に非常に簡単に答えを見つけることができます。 (私は、Windowsの同等のものを知らない)

from make_lines import num_lines 

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

はその後、LinuxやOSXでこのコマンドを実行します:

make_lines.py

num_lines = 34 

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

read_input.py 2つのファイルを作成します

python make_lines.py | python3 read_input.py 

私のコンピュータでは、それは終わるが、終わりまでに苦労して、遅くなるtherはかなり処理されます。最後に印刷するのは8589934592、つまり8 GiBです。時間とメモリの制限に関して許容できるものの定義に従って、あなた自身の価値を知ることができます。

関連する問題