🎯 핵심
Python의 내장함수는 C 언어로 구현되어 있어서 매우 빠릅니다.
📊 실행 흐름 비교
Python으로 작성한 함수
Python 코드 작성
↓
Python 인터프리터가 읽음
↓
매 줄마다 해석 (overhead)
↓
기계 코드 실행
↓
결과 반환 (느림 ⚠️)
C로 구현된 내장함수
Python에서 함수 호출
↓
미리 컴파일된 C 코드로 점프
↓
인터프리터 거치지 않고 직접 실행
↓
결과 반환 (빠름 ⚡️)
💻 코드 레벨 예시
Python 버전 (느림)
def my_sum(numbers):
result = 0
for num in numbers: # 인터프리터가 반복 해석
result += num # 매번 연산 해석
return result
# 100만 개 원소
import time
start = time.time()
my_sum(range(1000000))
print(time.time() - start)
# 약 0.05초C 버전 (빠름)
# sum()은 CPython에서 이렇게 구현됨 (의사코드):
#
# long sum_list(PyObject *list) {
# long total = 0;
# for (int i = 0; i < list->length; i++) {
# total += PyLong_AsLong(list->items[i]);
# }
# return total;
# }
#
# 인터프리터가 개입하지 않음 → 매우 빠름
import time
start = time.time()
sum(range(1000000))
print(time.time() - start)
# 약 0.002초 (25배 빠름!)🔬 내장함수들의 C 구현
| 함수 | C 구현 위치 | 성능 |
|---|---|---|
len() | Objects/listobject.c | O(1) |
sum() | Python/bltinmodule.c | O(n) 최적화 |
sorted() | Objects/listobject.c | O(n log n) 최적화 |
max(), min() | Python/bltinmodule.c | O(n) 최적화 |
.append() | Objects/listobject.c | O(1) 분할상환 |
.split() | Objects/unicodeobject.c | 최적화된 파싱 |
⚡ 왜 C가 빠를까?
| 측면 | Python | C |
|---|---|---|
| 코드 형태 | 텍스트 (해석 필요) | 기계어 (직접 실행) |
| 메모리 접근 | 추상화 계층 많음 | 직접 접근 |
| 연산 | 파이썬 객체 오버헤드 | 원시 자료형 사용 |
| 최적화 | 런타임 | 컴파일 시점 |
구체적 차이
# Python에서 간단한 덧셈
result = a + b
# 실제로 일어나는 일:
# 1. a의 타입 확인
# 2. b의 타입 확인
# 3. 타입 호환성 확인
# 4. + 연산자 찾기
# 5. 메서드 호출
# 6. 결과 객체 생성
# → 매우 복잡한 오버헤드!
# C에서:
int result = a + b;
// CPU 한 줄 명령: ADD 레지스터
// 끝!🧪 실제 성능 비교
1. 리스트 합계 (100만 원소)
numbers = list(range(1000000))
# Python 구현
def py_sum(lst):
total = 0
for n in lst:
total += n
return total
# 결과
import timeit
py_sum: 0.052초
sum(): 0.002초
→ C 버전이 26배 빠름!2. 리스트 정렬
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5]
# Python 정렬 (Timsort, C 구현)
sorted(numbers) # 0.0001초
# Python으로 버블정렬 구현
def bubble_sort(lst):
for i in range(len(lst)):
for j in range(len(lst)-1-i):
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
return lst
bubble_sort(numbers.copy()) # 0.0005초 (수배 느림)💡 개발자가 알아야 할 것
✅ 항상 내장함수 사용
# 좋음
result = sum(numbers)
result = max(numbers)
result = sorted(numbers)
text = "hello world".upper()
# 나쁨 (사용자 정의 함수)
result = my_sum(numbers)
result = my_max(numbers)
result = my_sorted(numbers)✅ 리스트 컴프리헨션 (파이썬스러움)
# 좋음 (내부적으로 최적화됨)
filtered = [x for x in data if x > 10]
# 나쁨 (Python 루프)
filtered = []
for x in data:
if x > 10:
filtered.append(x)✅ NumPy/Pandas (대량 데이터)
import numpy as np
# NumPy (C 레벨)
arr = np.array([1, 2, 3, 4, 5])
result = arr.sum() # C 수준 성능
# 또는 Pandas
import pandas as pd
df['value'].sum() # C 최적화🎯 결론
| 상황 | 선택 | 이유 |
|---|---|---|
| 일반 데이터 처리 | 내장함수 | C 최적화 |
| 대량 수치 계산 | NumPy | BLAS/LAPACK (C/Fortran) |
| 복잡한 로직 | 사용자 정의 | 유연성 필요 |
핵심 원칙:
Python 내장함수는 이미 최적화되어 있습니다. 먼저 내장함수로 해결할 수 있는지 확인하세요.
🔗 관련 개념
다음 단계:
- C 언어 프로그램은 어떻게 실행될까? - C 컴파일의 기본 원리 이해
- Python 사용자 정의 함수 vs 내장함수 - 실전 성능 비교
관련 포스트:
- 데이터베이스 엔진이란? - 데이터베이스 내장함수의 최적화
- 프로그램, 드라이버, 엔진의 관계 - 계층별 성능 특성