C 行の読み取りが Python より遅いのはなぜですか?どうすれば最適化できますか?

Mary-Kate Olsen
リリース: 2024-11-23 19:14:12
オリジナル
405 人が閲覧しました

Why is C   Line Reading Slower Than Python, and How Can It Be Optimized?

C と Python での行読み取りのパフォーマンス比較: C の方が遅いのはなぜですか?

C と Python を使用して標準入力からの行読み取りのパフォーマンスを比較する場合、次のことが考えられます。 C コードの実行速度が Python のコードよりもかなり遅くなる傾向があることに驚くでしょう。これは、2 つの言語のデフォルトの入出力 (I/O) 設定の根本的な違いに起因すると考えられます。

C の入出力特性を理解する

デフォルトでは、C 入力ストリームcin は標準 I/O (stdio) システムと同期されます。これは、cin が入力バッファリングを回避し、必要に応じてデータを 1 文字ずつ読み取ることを意味します。このアプローチにより、C I/O ストリームと標準入出力関数を混合する場合の潜在的な問題は防止されますが、特に大量のデータを読み取る場合にパフォーマンスが低下します。

Python のデフォルトの入力バッファリング

対照的に、Pythonデフォルトではバッファリングされた入力を使用します。 Python で標準入力から読み取る場合、インタープリターは入力をより大きなチャンクで読み取り、必要なシステム コールの数を減らします。バッファリングにより、システム コールに関連するオーバーヘッドが最小限に抑えられ、パフォーマンスが向上し、入力処理が大幅に高速化されます。

C ストリーム同期の無効化

C で Python と同様のパフォーマンスを実現するには、同期を明示的に無効にすることができます。 ios_base::sync_with_stdio(false) メソッドを使用して、cin と stdio の間で接続します。これにより、cin が入力を独立してバッファリングできるようになり、パフォーマンスが向上します。

追加の最適化: fgets の使用

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート