C에서 stdin의 줄을 읽는 것이 Python보다 훨씬 느린 이유는 무엇입니까?
표준 입력(stdin)에서 줄을 읽는 것이 Python에서 상당히 느릴 수 있습니다. C 입력 스트림의 기본 설정이 다르기 때문에 C와 Python을 비교합니다.
기본값 버퍼링
기본적으로 C 입력 스트림(cin)은 표준 입출력(stdio) 스트림과 동기화됩니다. 이 동기화로 인해 cin은 입력 버퍼링을 피하게 되어 한 번에 한 문자씩 읽게 됩니다.
Python 버퍼링
반면, stdin 스트림은 Python에서는 기본적으로 버퍼링되므로 더 큰 입력 덩어리를 한 번에 읽을 수 있습니다. 이렇게 하면 데이터를 읽는 데 필요한 시스템 호출 수가 줄어들어 성능이 향상됩니다.
C 코드 수정
C에서 유사한 성능을 얻으려면 비활성화할 수 있습니다. 기본 기능의 시작 부분에 다음 줄을 추가하여 stdio와의 동기화를 수행합니다.
std::ios_base::sync_with_stdio(false);
이렇게 하면 cin이 입력을 버퍼링하고 상당히 읽기 속도가 향상됩니다.
fgets와 getline 비교
또한 한 줄을 읽는 C 함수인 getline() 대신 fgets를 사용하는 것을 고려할 수 있습니다. 파일이나 표준 입력의 텍스트. fgets는 동적 메모리 할당이 필요하지 않아 성능이 더욱 향상된다는 장점이 있습니다.
성능 비교
아래는 다양한 접근 방식의 초당 라인 수(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 중국어 웹사이트의 기타 관련 기사를 참조하세요!