C では標準入力 (stdin) からの行の読み取りが Python よりもはるかに遅いのはなぜですか?
標準入力 (stdin) からの行の読み取りは、Python では大幅に遅くなることがあります。 C 入力のデフォルト設定が異なるため、C と Python を比較stream.
デフォルト バッファリング
デフォルトでは、C 入力ストリーム (cin) は標準入出力 (stdio) ストリームと同期されます。この同期により、cin は入力バッファリングを回避し、一度に 1 文字ずつ読み取ることになります。
Python バッファリング
対照的に、stdin ストリームPython ではデフォルトでバッファリングされるため、一度に大きな入力チャンクを読み取ることができます。これにより、データの読み取りに必要なシステム コールの数が減り、パフォーマンスが向上します。
C コードの修正
C で同様のパフォーマンスを実現するには、メイン関数の先頭に次の行を追加することで stdio と同期します:
std::ios_base::sync_with_stdio(false);
これにより、 cin を使用して入力をバッファリングし、読み取り速度を大幅に向上させます。
fgets と getline の比較
さらに、getline() の代わりに fgets を使用することを検討することもできます。ファイルまたは標準入力からテキスト行を読み取る C 関数。 fgets には、動的なメモリ割り当てが必要ないという利点があり、パフォーマンスがさらに向上します。
パフォーマンスの比較
以下は、さまざまなアプローチの 1 秒あたりの行数 (LPS) を比較した表です。 100M 行ファイルを使用:
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not fair comparison) | 54,644,808 |
ご覧のとおり、無効にします同期または fgets を使用すると、C のパフォーマンスが大幅に向上します。
以上がC の stdin 入力が Python よりも大幅に遅いのはなぜですか?どうすれば改善できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。