파이썬은 생산성이 높은 언어지만, “느리다”, “메모리를 많이 쓴다”는 이야기도 늘 따라다닙니다. 그렇다면 실제로 어느 정도로 느리고, 얼마나 많은 메모리를 쓰는 걸까요?
이번 글에서는 mkennedy.codes에서 공개한 파이썬 성능 벤치마크 결과를 기반으로, 파이썬 개발자가 알아두면 좋은 연산 속도, 메모리 사용량, 라이브러리별 성능 차이를 정리합니다. 추상적인 감이 아닌, 실제 측정 수치로 파이썬의 특성을 이해하는 것이 목표입니다.
이 벤치마크는 어떤 자료인가?
이 자료는 파이썬의 다양한 연산을 실제로 측정해 정량적인 성능 지표로 정리한 것이 특징입니다.
- 환경: CPython 3.14.2
- 하드웨어: Mac Mini M4 Pro (ARM, 14코어, 24GB RAM)
- 관점: 절대 성능보다는 상대적 비교에 중점
- 공개성: 코드와 데이터는 GitHub에 공개됨
즉, “이게 더 빠르다/느리다”를 감으로 말하는 것이 아니라, 숫자로 비교할 수 있는 근거 자료입니다.
메모리 사용량: 파이썬 객체는 생각보다 크다
기본 메모리 비용
파이썬은 객체 지향 언어인 만큼, 모든 객체에 상당한 메타데이터가 붙습니다.
- 빈 파이썬 프로세스: 약 15.73MB
- 빈 문자열: 41바이트
- 문자열은 문자 1개당 1바이트씩 추가
- 예: 100자 문자열 → 141바이트
- 숫자형
- 작은 정수(0–256): 28바이트
- 큰 정수(1000): 28바이트
- 매우 큰 정수(10¹⁰⁰): 72바이트
- 부동소수점(float): 24바이트
컬렉션 메모리 크기
- 빈 리스트: 56B
- 빈 딕셔너리: 64B
- 빈 세트: 216B
1,000개 요소를 담으면 차이는 더 분명해집니다.
- 리스트: 35.2KB
- 딕셔너리: 63.4KB
- 세트: 59.6KB
클래스 인스턴스와 __slots__
- 일반 클래스(속성 5개): 694B
- __slots__ 사용 클래스: 212B
1,000개 인스턴스를 만들면
- 일반 클래스: 165.2KB
- __slots__: 79.1KB
👉 __slots__는 메모리를 절반 이하로 줄이는 강력한 도구라는 점이 수치로 드러납니다.
기본 연산 속도: 나노초 단위의 세계
산술 연산
- 정수 덧셈: 19ns
- 실수 덧셈: 18.4ns
- 정수 곱셈: 19.4ns
문자열 포맷팅
- 문자열 연결(+): 39.1ns
- f-string: 64.9ns
- % 포맷: 89.8ns
- .format(): 103ns
👉 f-string은 가독성과 성능의 균형이 좋은 선택임을 확인할 수 있습니다.
리스트와 컴프리헨션: 왜 자주 쓰라고 할까?
- list.append(): 28.7ns
- 리스트 컴프리헨션(1,000개): 9.45μs
- 동일 작업 for문: 11.9μs
👉 리스트 컴프리헨션은 for문보다 약 26% 빠름
단순한 스타일 차이가 아니라, 실제 성능 차이가 있습니다.
컬렉션 접근 성능: 리스트 vs 딕셔너리 vs 세트
단일 접근
- 리스트 인덱스 접근: 17.6ns
- 딕셔너리 조회: 21.9ns
- 세트 멤버십 검사: 19ns
멤버십 테스트 (1,000개 기준)
- 리스트 in: 3.85μs
- 딕셔너리 / 세트: 수십 ns 수준
👉 리스트 탐색은 딕셔너리·세트보다 약 200배 느림
👉 “존재 여부 확인”에는 리스트보다 세트/딕셔너리가 압도적으로 유리합니다.
클래스와 속성 접근
- 속성 읽기: 14.1ns
- 속성 쓰기: 약 16ns
- @property 읽기: 19ns
- getattr(): 13.8ns
- hasattr(): 23.8ns
__slots__를 사용해도 속성 접근 속도는 거의 동일, 메모리만 크게 절약됩니다.
JSON과 직렬화: 표준이 항상 최선은 아니다
직렬화 성능
- json: 2.65μs
- orjson: 310ns (8배 이상 빠름)
- msgspec: 445ns
- ujson: 1.64μs
역직렬화
- orjson: 839ns (가장 빠름)
Pydantic
- model_dump_json(): 1.54μs
- model_validate_json(): 2.99μs
👉 고성능 API나 대량 데이터 처리에서는 orjson, msgspec 같은 대안 라이브러리가 큰 차이를 만듭니다.
웹 프레임워크 응답 속도 비교
동일 JSON 응답 기준:
- Starlette: 8.01μs
- Litestar: 8.19μs
- FastAPI: 8.63μs
- Flask: 16.5μs
- Django: 18.1μs
👉 FastAPI는 Django 대비 약 2배 빠른 응답 속도를 보입니다.
파일 입출력과 직렬화 포맷
- 파일 열기/닫기: 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
데이터베이스와 캐시 성능
- 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가 강점
함수 호출과 예외 처리 비용
- 빈 함수 호출: 22.4ns
- 메서드 호출: 23.3ns
- lambda 호출: 19.7ns
- try/except (예외 없음): 21.5ns
- 예외 발생 시: 139ns
👉 예외는 “제어 흐름”으로 쓰기엔 비용이 확실히 큼
비동기 처리의 숨은 비용
- 코루틴 생성: 47ns
- run_until_complete: 27.6μs
- asyncio.sleep(0): 39.4μs
- gather(10 coroutines): 55μs
동기 함수 호출(약 20ns) 대비
비동기 실행은 약 1,000배 느림
👉 비동기는 “무조건 빠르다”가 아니라,
병렬성이 꼭 필요한 상황에서만 사용해야 할 도구입니다.
핵심 교훈 정리
- 파이썬 객체는 메모리 오버헤드가 매우 큼
- 리스트 탐색보다 딕셔너리·세트 조회가 수백 배 빠름
- __slots__는 메모리를 절반 이하로 줄이면서 성능 손실 거의 없음
- orjson, msgspec 같은 라이브러리는 JSON 처리 성능을 3~8배 개선
- 비동기 처리는 오버헤드가 크므로 신중하게 사용해야 함
숫자를 알면 설계가 달라진다
이 벤치마크가 주는 가장 큰 가치는 “파이썬은 느리다/빠르다”라는 감정적인 논쟁이 아니라, 어디서 비용이 발생하는지 정확히 알게 해준다는 점입니다.
이 수치들을 알고 나면
- 어떤 자료구조를 써야 할지
- 언제 비동기를 써야 할지
- 어떤 라이브러리를 선택해야 할지
코드 설계의 기준이 훨씬 명확해집니다.
파이썬을 더 깊이, 더 효율적으로 쓰고 싶다면 이 성능 수치들은 한 번쯤 꼭 짚고 넘어가야 할 기준선이라고 볼 수 있습니다.
https://mkennedy.codes/posts/python-numbers-every-programmer-should-know/
Python Numbers Every Programmer Should Know
A cheat sheet of real-world timing and memory numbers to guide performance-sensitive decisions.
mkennedy.codes

'Python' 카테고리의 다른 글
| 파이썬 소스 코드 주석을 표준화하는 방법: Action Comment 표준 라이브러리 이해하기 (0) | 2026.01.10 |
|---|---|
| Django 6.0 핵심 변화와 실무 영향 정리 (0) | 2025.12.09 |
| Python과 Rust의 결합: 고성능 AI 시스템을 위한 실전 통합 전략 (0) | 2025.12.05 |
| Async 코드가 오히려 느려지는 이유와 해결 전략 정리 (0) | 2025.11.17 |
| Python 개발의 판을 바꾸다: uv, 지난 10년간 가장 혁신적인 Python 관리 도구 (0) | 2025.11.02 |