概要
C++とPython
で標準入力(stdin
)からのデータを読み取る際、処理速度に大きな違いが見られることがあります。特に大量のデータを読み込む際、C++の標準的なcin
はPython
のsys.stdin
よりも圧倒的に遅いです。しかし、これはC++が標準入出力との同期処理をデフォルトで行っているためであり、適切に設定を変更すればC++も同等以上の速度を出すことが可能です。
C++の標準入力処理の問題点
C++でcin
を使用してデータを読み込む場合、cin
は標準的にstdio
との同期が有効になっており、これが速度低下の原因となります。標準入出力と同期することで、cin
とstdio
が同時に使われた場合にデータの不整合が生じないようにしていますが、この同期処理が非常に多くのシステムコールを発生させるため、特に大規模データの入力時に大きな負荷をかけます。
Pythonのsys.stdin
の動作
一方で、Python
のsys.stdin
はデフォルトでバッファリング処理を行っているため、データの読み込みが効率的です。Python
は標準入力の処理が非常に高速であり、同様の条件でC++と比較した場合、通常はPython
が圧倒的に優れたパフォーマンスを示します。
sync_with_stdio(false)
の使用によるC++の高速化
C++の標準入力処理を高速化するためには、sync_with_stdio(false)
を使用して標準入出力の同期を解除することが効果的です。これにより、cin
は独立してバッファリングを行うようになり、標準入力からの読み込み速度が飛躍的に向上します。
例: sync_with_stdio(false)
の使用
#include <iostream>
int main() {
std::ios::sync_with_stdio(false); // 標準入出力との同期を無効化
std::string line;
while (std::getline(std::cin, line)) {
// 行の処理
}
return 0;
}
このコードにより、cin
の同期処理が解除され、より効率的に標準入力を読み取ることができます。また、さらなる高速化のためには、入力バッファを手動で設定することも有効です。
実際のベンチマーク結果
実際のベンチマークでは、Python
とC++で同じデータを読み込んだ場合、同期を解除していないC++は9秒かかるのに対し、Python
は1秒で処理を完了しました。しかし、sync_with_stdio(false)
を使ったC++コードは、Python
と同等の1秒まで速度を向上させることができました。
まとめ
C++の標準入力処理はデフォルトでは同期処理が原因で遅くなりますが、sync_with_stdio(false)
を使用することでこの問題を解消し、Python
と同等の高速なデータ処理が可能になります。大量のデータを扱う場面では、このテクニックが非常に有効です。