>백엔드 개발 >C++ >C의 stdin 입력이 Python의 입력보다 현저히 느린 이유는 무엇이며 어떻게 개선할 수 있습니까?

C의 stdin 입력이 Python의 입력보다 현저히 느린 이유는 무엇이며 어떻게 개선할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-18 11:57:16869검색

Why is C  's stdin Input Significantly Slower Than Python's, and How Can It Be Improved?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.