C と Python を使用して標準入力からの行読み取りのパフォーマンスを比較する場合、次のことが考えられます。 C コードの実行速度が Python のコードよりもかなり遅くなる傾向があることに驚くでしょう。これは、2 つの言語のデフォルトの入出力 (I/O) 設定の根本的な違いに起因すると考えられます。
デフォルトでは、C 入力ストリームcin は標準 I/O (stdio) システムと同期されます。これは、cin が入力バッファリングを回避し、必要に応じてデータを 1 文字ずつ読み取ることを意味します。このアプローチにより、C I/O ストリームと標準入出力関数を混合する場合の潜在的な問題は防止されますが、特に大量のデータを読み取る場合にパフォーマンスが低下します。
対照的に、Pythonデフォルトではバッファリングされた入力を使用します。 Python で標準入力から読み取る場合、インタープリターは入力をより大きなチャンクで読み取り、必要なシステム コールの数を減らします。バッファリングにより、システム コールに関連するオーバーヘッドが最小限に抑えられ、パフォーマンスが向上し、入力処理が大幅に高速化されます。
C で Python と同様のパフォーマンスを実現するには、同期を明示的に無効にすることができます。 ios_base::sync_with_stdio(false) メソッドを使用して、cin と stdio の間で接続します。これにより、cin が入力を独立してバッファリングできるようになり、パフォーマンスが向上します。
getline(cin, input_line) を使用する代わりに、fgets(input_line, sizeof(input_line) の使用を検討してください。 、標準入力) を直接使用します。 fgets は、ストリームから入力行を読み取り、それを文字配列に格納する C 関数です。 cin ストリームを回避することで、オーバーヘッドをさらに削減し、パフォーマンスを向上できる可能性があります。
提供された表は、C と Python のさまざまなアプローチの行読み取り速度をまとめたものです。
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 |
結果から明らかなように、デフォルトの C 実装のパフォーマンスは Python よりも大幅に遅くなります。ただし、ストリーム同期を無効にするか、 fgets を直接使用することで、C で同等以上のパフォーマンスを達成できます。
以上がC 行の読み取りが Python より遅いのはなぜですか?どうすれば最適化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。