-
파이썬의 연산·메모리·입출력 성능 수치를 체계적으로 측정한 벤치마크 결과로, 각 연산의 시간과 메모리 사용량을 정량화함
-
속도 측면에서는 속성 접근 14ns, 리스트 추가 29ns, 파일 열기 9μs, FastAPI 응답 8.6μs 등 다양한 연산의 상대적 지연시간을 제시
-
메모리 측면에서는 빈 문자열 41바이트, 정수 28바이트, 빈 리스트 56바이트, 빈 딕셔너리 64바이트, 빈 프로세스 16MB 등 구체적 수치를 제시
-
데이터 구조·직렬화·비동기 처리 등 각 영역별로 표준 라이브러리와 대안 라이브러리(orjson, msgspec 등)의 성능 차이를 비교
-
핵심 교훈으로는 파이썬 객체의 높은 메모리 오버헤드, dict/set의 빠른 조회, __slots__의 메모리 절감 효과, 비동기 처리의 오버헤드 인식이 강조됨
개요
- 파이썬 개발자가 알아야 할 성능 지표를 정리한 자료로, 연산 속도와 메모리 사용량을 실제 측정값으로 제시
- 벤치마크는 CPython 3.14.2, Mac Mini M4 Pro (ARM, 14코어, 24GB RAM) 환경에서 수행
- 결과는 상대적 비교에 중점을 두며, 코드와 데이터는 GitHub 저장소에서 공개됨
메모리 사용량 (Memory Costs)
-
빈 파이썬 프로세스는 15.73MB 메모리 사용
-
문자열은 기본 41바이트, 문자 1개당 1바이트 추가
- 예: 빈 문자열 41B, 100자 문자열 141B
-
숫자형은 작은 정수(0–256) 28B, 큰 정수(1000)도 28B, 매우 큰 정수(10ⁱ⁰⁰) 72B, 부동소수점 24B
-
컬렉션의 기본 크기: 리스트 56B, 딕셔너리 64B, 세트 216B
- 1,000개 항목일 때 리스트 35.2KB, 딕셔너리 63.4KB, 세트 59.6KB
-
클래스 인스턴스: 일반 클래스(5속성) 694B, __slots__ 클래스 212B
- 1,000개 인스턴스 시 일반 클래스 165.2KB, __slots__ 클래스 79.1KB
기본 연산 (Basic Operations)
-
산술 연산: 정수 덧셈 19ns, 실수 덧셈 18.4ns, 정수 곱셈 19.4ns
-
문자열 연산: 연결 39.1ns, f-string 64.9ns, .format() 103ns, % 포맷 89.8ns
-
리스트 연산: append() 28.7ns, 리스트 컴프리헨션(1,000개) 9.45μs, 동일 for문 11.9μs
- 리스트 컴프리헨션이 for문보다 약 26% 빠름
컬렉션 접근 및 반복 (Collection Access and Iteration)
-
키/인덱스 접근: 딕셔너리 조회 21.9ns, 세트 멤버십 19ns, 리스트 인덱스 접근 17.6ns
- 리스트 멤버십(1,000개)은 3.85μs로, 세트/딕셔너리보다 약 200배 느림
-
길이 확인: len()은 리스트 18.8ns, 딕셔너리 17.6ns, 세트 18ns
-
반복: 리스트(1,000개) 7.87μs, 딕셔너리 8.74μs, sum() 1.87μs
클래스와 속성 (Class and Object Attributes)
-
속성 접근 속도: 일반 클래스와 __slots__ 클래스 모두 읽기 14.1ns, 쓰기 약 16ns
-
기타 연산: @property 읽기 19ns, getattr() 13.8ns, hasattr() 23.8ns
-
__slots__ 사용 시 메모리 절감 효과는 2배 이상, 접근 속도는 동일 수준
JSON 및 직렬화 (JSON and Serialization)
-
표준 라이브러리 대비 대안 라이브러리 성능
-
orjson은 복잡 객체 직렬화 시 310ns로, json의 2.65μs보다 8배 이상 빠름
-
msgspec은 445ns, ujson은 1.64μs
-
역직렬화에서도 orjson이 839ns로 가장 빠름
-
Pydantic: model_dump_json() 1.54μs, model_validate_json() 2.99μs
웹 프레임워크 (Web Frameworks)
- 동일 JSON 응답 기준 FastAPI 8.63μs, Starlette 8.01μs, Litestar 8.19μs, Flask 16.5μs, Django 18.1μs
- FastAPI는 Django보다 약 2배 빠른 응답 속도
파일 입출력 (File I/O)
- 파일 열기·닫기 9.05μs, 1KB 읽기 10μs, 1MB 읽기 33.6μs
- 쓰기: 1KB 35.1μs, 1MB 207μs
-
Pickle은 json보다 직렬화·역직렬화 모두 약 2배 빠름 (pickle.dumps() 1.3μs, json.dumps() 2.72μs)
데이터베이스 및 캐시 (Database and Persistence)
-
SQLite: insert 192μs, select 3.57μs, update 5.22μs
-
diskcache: set 23.9μs, get 4.25μs
-
MongoDB: insert 119μs, find_one 121μs
- SQLite가 읽기 속도에서 가장 빠르며, diskcache는 쓰기 성능이 우수
함수 호출 및 예외 (Function and Call Overhead)
-
함수 호출: 빈 함수 22.4ns, 메서드 23.3ns, lambda 19.7ns
-
예외 처리: try/except(정상) 21.5ns, 예외 발생 시 139ns
-
형 검사: isinstance() 18.3ns, type() 비교 21.8ns
비동기 오버헤드 (Async Overhead)
-
코루틴 생성 47ns, run_until_complete 27.6μs
-
asyncio.sleep(0) 39.4μs, gather(10 coroutines) 55μs
-
동기 함수 호출(20ns) 대비 비동기 실행(28μs) 은 약 1,000배 느림
주요 교훈 (Key Takeaways)
-
파이썬 객체의 메모리 오버헤드는 크며, 빈 리스트조차 56바이트 사용
-
딕셔너리·세트 조회는 리스트 탐색보다 수백 배 빠름
-
orjson, msgspec 등 대체 JSON 라이브러리는 표준보다 3~8배 빠름
-
비동기 처리는 오버헤드가 크므로 병렬성이 필요한 경우에만 사용 권장
-
__slots__ 는 메모리를 절반 이하로 줄이면서 성능 손실이 거의 없음