input() と sys.stdin の対決
大きなテストで通常の input() が不利になる理由を学びます
「input() と sys.stdin の対決」はCoddyKit上の無料Competitive Programming Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCompetitive Programming Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Competitive Programming Academyコースには全4レッスンが含まれています。
input()に潜むコスト
input()を呼び出すたびに、内部で追加の処理が行われます。数行なら問題ありませんが、コンテストでは何千行もの入力が与えられることがあります。⏱️
積み重なる理由
遅くなる原因は呼び出しごとのオーバーヘッドです。プロンプト、フラッシュ、エンコーディングの確認が、1行読むたびに繰り返されます。
sys.stdinを知る
より高速な方法は、生の入力ストリームであるsys.stdinから読み取ることです。input()が追加する親切な処理を省略できます。
import sys
data = sys.stdin1行を高速に読む
sys.stdin.readline()を使うと、1行をすばやく取得できます。input()と同じように動作しますが、呼び出しごとのオーバーヘッドがはるかに小さくなります。
import sys
line = sys.stdin.readline()改行に注意する
readline()は末尾の改行文字を残します。値を解析する前に、.strip()を呼び出して削除しましょう。
n = int(sys.stdin.readline().strip())すべてを一度に読み込む
最速で読み取るには、sys.stdin.read()で入力全体を一度に取得し、その後で自分でテキストを処理します。
data = sys.stdin.read()全体を分割する
read()の後に.split()を呼び出すと、すべてのトークンを1つの平坦なリストにできます。空白と改行をまとめて処理できます。
tokens = sys.stdin.read().split()速度のためにinputを再束縛する
よく使われる方法は、inputをreadlineに割り当てることです。既存のコードをほぼ変えずに高速化できます。
import sys
input = sys.stdin.readlineinput()で十分な場合
数行しか読まない問題なら、通常のinput()でまったく問題ありません。大量入力のときだけ高速な方法を使いましょう。
printにもオーバーヘッドがある
出力も同じです。print()を何千回も呼び出すと遅くなります。後のバッチ処理のレッスンで解決方法を学びます。
適切な方法を選ぶ
目安は、入力が少なければinput()、多ければsys.stdinです。Nの大きさに合った方法を選ぶことで、時間制限に間に合わせやすくなります。
確認問題
入力速度について、直感的に確認してみましょう。
まとめ:高速な入力
sys.stdinをinput()の高速な代替手段として学びました。1行ずつならreadline()、すべて読むならread().split()を使います。入力サイズに合った方法を選びましょう。⚡
よくある質問
「input() と sys.stdin の対決」レッスンは無料ですか?
はい。「input() と sys.stdin の対決」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Competitive Programming Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Competitive Programming Academyコースには全4レッスンが含まれています。
「input() と sys.stdin の対決」で何を学びますか?
大きなテストで通常の input() が不利になる理由を学びます ブラウザで直接実行するハンズオンコードでCompetitive Programming Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Competitive Programming Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCompetitive Programming Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「input() と sys.stdin の対決」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCompetitive Programming Academyレッスンでコードを書いて実行できますか?
はい。すべてのCompetitive Programming Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- input() と sys.stdin の対決
- 1 行に並んだ複数の数値を解析する
- 正しい方法でまとめて出力する
- N 行の読み込みとエッジケース