비교할 문제

for문과 comprehension 속도에서 확인할 질문은 같은 list를 만드는 일반 for, list comprehension과 map의 비용은 어떻게 다른가입니다. 모든 후보가 같은 list 원소와 예외를 만들게 합니다. lazy iterator인 generator는 결과 계약이 달라 이 비교에서 제외합니다. 결과값, 순서, 오류 처리와 부수 효과가 다르면 같은 성능 비교가 아닙니다. 먼저 두 후보가 같은 일을 하는지 작은 입력으로 확인합니다.

원인 분석과 재현

list comprehension은 list 생성이라는 같은 결과에서 유리할 수 있지만 side effect loop나 iterator 결과와는 의미가 다릅니다.

원소 100개·10만 개에서 시간과 peak memory를 함께 측정하고 pure Python lambda와 C 구현 built-in을 구분합니다. runtime version, 운영체제, CPU와 memory 제한도 결과와 함께 기록합니다.

비교 질문은 같은 list를 만드는 일반 for, list comprehension과 map의 비용은 어떻게 다른가입니다.

후보 유리한 조건 함께 치르는 비용
list comprehension 전체 list가 필요하고 표현이 단순 입력 크기만큼 결과 memory 필요
map + callable 기존 callable을 적용해 list로 변환 lambda·callable 구현에 따라 비용이 달라짐
일반 for 분기·logging·복잡한 상태 갱신 단순 변환은 코드가 길어질 수 있음
from statistics import median
from timeit import repeat

setup = "values = list(range(100_000))"
cases = {
    "for_append": "out = []\nfor v in values:\n    out.append(v * 2)",
    "comprehension": "out = [v * 2 for v in values]",
    "map": "out = list(map(lambda v: v * 2, values))",
}
for name, statement in cases.items():
    samples = repeat(statement, setup=setup, number=50, repeat=7)
    print(name, {"min": min(samples), "median": median(samples)})

해결 방안과 판정

timeit.repeat() 결과 전체를 보관하고, 작은 코드 조각의 하한을 볼 때는 공식 문서가 안내하는 최솟값도 함께 확인합니다. 서비스 지연을 재는 경우에는 median과 p95를 별도로 기록합니다. CPU time, allocation, RSS·heap, GC, I/O 중 이 작업에 직접 관련된 지표만 선택합니다. CPython version과 callable 종류에 따라 순위가 바뀝니다. 전체 list가 필요하지 않은 작업은 이 결과를 적용하지 않고 generator 계약으로 따로 비교합니다.

차이가 반복 실행의 흔들림보다 작다면 더 단순하고 읽기 쉬운 구현을 선택합니다. 차이가 충분히 크더라도 실제 요청 전체의 지연과 자원 사용이 개선되는지 확인한 뒤 적용합니다.

공식 문서와 적용 범위

문서의 기본값과 동작은 version에 따라 달라질 수 있습니다. 현재 Python 구현과 version, dependency, 입력 크기와 실행 환경에서 다시 확인합니다.