C 標準入力の読み取りが Python の効率に及ばない理由
標準からの文字列入力行の読み取りにおける Python と C のパフォーマンスを比較しながら入力 (stdin) を実行すると、顕著な差異が現れました。C コードの実行が大幅に遅くなりました。これにより、このパフォーマンス ギャップの根本的な理由を調査することになりました。
この問題は、 C のデフォルト設定に起因しています。デフォルトでは、cin などの istream は stdio と同期するため、入力バッファリングが回避されます。パフォーマンスを最適化するために、std::ios_base::sync_with_stdio(false) ステートメントを使用してこの同期を無効にすることができます。この調整により、パフォーマンス上の主要な制約が緩和されます。
標準入力ストリームは、設計により Python と C で動作が異なります。 Python は通常バッファリングされますが、C はデフォルトでバッファリングされません。通常の状況では、バッファリングによりシステムコールが減少し、効率が向上します。ただし、C の FILE* ベースの stdio および iostream の個別の実装とバッファを一緒に使用すると、潜在的な問題が発生します。
バッファの不整合や予期しない結果を避けるために、C はデフォルトでストリームを stdio と同期します。これにより潜在的な問題は防止されますが、特に大量の入力を処理する場合にオーバーヘッドが発生します。
最大のパフォーマンスを達成するために、プログラマは sync_with_stdio メソッドを使用して同期を無効にすることができます。この最適化により、C 標準ストリームが独立してバッファリングできるようになり、特定のシナリオで速度が大幅に向上します。
パフォーマンス ベンチマーク
より包括的な比較については、さまざまなアプローチによるパフォーマンス ベンチマークを次に示します。 :
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 | 54,644,808 | (Not a fair comparison) |
明らかなように、同期を無効にして fgets の結果を使用すると、 C のパフォーマンスが大幅に向上しました。
以上がC の標準入力の読み取りが Python よりも遅いのはなぜですか?どうすれば改善できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。