https://docs.python.org/3/tutorial/modules.html#compiled-python-files
.pyc는 모듈을 바이트코드로 컴파일해 둔 캐시 파일이다.
실행 속도를 높이는 게 아니라 “import 시 로드 속도”를 빠르게 해서, import 때 소스를 다시 컴파일하지 않고 바로 바이트코드를 읽어들일 수 있게 해준다.
mtime이 바뀐 소스가 있으면 자동으로 새로 컴파일해 .pyc를 갱신하고, 소스가 변하지 않았으면 기존 .pyc를 그대로 써서 로딩만 빠르게 한다.
- 위치/이름:
- 모듈을 import하면 자동으로 바이트코드로 컴파일해 __pycache__/모듈.런타임버전.pyc에 저장(예: pycache/spam.cpython-311.pyc).
- 서로 다른 파이썬 버전이 공존 가능.
- 갱신 조건:
- 소스 수정 시간이 캐시보다 최신이면 자동으로 다시 컴파일. 별도 작업 필요 없음.
- 예외:
- python module.py처럼 커맨드라인으로 직접 실행한 모듈은 캐시를 안 쓰고 항상 재컴파일하며 저장도 안 함. 또 소스(.py) 없이 .pyc만 있으면 캐시 체크를 안 하고 그 .pyc만 사용.
- 성능:
- 실행 속도는 동일, 로딩만 빨라짐.
- 옵션:
- -O(assert 제거), -OO(assert + docstring 제거)로 더 작은 .pyc 생성; 의존성이 있으면 주의. compileall로 디렉터리 전체 .pyc 미리 만들 수 있음.
일반적인 CPython 설정(타임스탬프 기반 .pyc)에서는 모듈을 import할 때 소스(.py)의 mtime/파일 크기와 캐시된 .pyc의 기록을 비교해서 소스가 더 새로우면 다시 컴파일해 .pyc를 갱신합니다. 소스가 변하지 않았으면 기
존 .pyc를 그대로 씁니다. 예외는:
- 소스 없이 .pyc만 있으면 mtime 비교 없이 .pyc를 사용.
- python module.py로 직접 실행한 진입점 모듈은 캐시를 쓰지 않고 .pyc를 만들지도 않음.
- 환경변수 PYTHONDONTWRITEBYTECODE=1이면 .pyc를 아예 만들지 않습니다.
(참고: PEP 552의 해시 기반 .pyc 모드도 있지만, 기본은 mtime+크기 체크 방식입니다.)