Python 주니어 성능 최적화 기술면접

Python 주니어 (1~3년) 성능 최적화 10문항 조회수 23 · 2026-08-10 (월) 12:11:55
1 메모리 최적화
Medium

Q. 대용량 로그 파일(10GB)을 처리하는 Python 스크립트를 작성했는데, 메모리 부족 오류가 발생합니다. 파일 전체를 메모리에 로드하는 방식의 문제점과, 제너레이터(Generator)를 활용한 메모리 효율적인 처리 방법을 설명해주세요.

한 번에 모든 데이터를 메모리에 올리지 않고, 필요한 만큼만 순차적으로 처리하는 방법을 생각해보세요.

A. 모범답안

파일 전체를 read()로 읽으면 모든 내용이 메모리에 적재되어 10GB의 메모리가 필요합니다. 제너레이터를 사용하면 한 줄씩 또는 청크 단위로 읽어 처리한 후 메모리에서 해제되므로 상수 수준의 메모리만 사용합니다. 예를 들어 파일 객체를 직접 순회하거나 yield를 사용한 함수를 작성하면 지연 평가(lazy evaluation)로 필요한 시점에만 데이터를 가져옵니다. 이를 통해 메모리 사용량을 수십~수백 배 줄일 수 있으며, 대용량 데이터 처리에 필수적인 패턴입니다.

핵심 포인트
  • • read() 전체 로드 시 메모리 부족 발생
  • • 제너레이터는 지연 평가로 필요한 만큼만 메모리 사용
  • • 파일 객체 순회나 yield 키워드 활용
  • • 메모리 사용량을 상수 수준으로 유지 가능
답변에 넣으면 좋은 키워드
제너레이터 지연 평가 메모리 효율 yield 청크 단위 처리
실무에서는

대용량 CSV 파일 처리, 로그 분석, 데이터 ETL 작업에서 메모리 효율적인 처리를 위해 사용됩니다.

Follow-up 질문

제너레이터 표현식(Generator Expression)과 리스트 컴프리헨션의 메모리 사용량 차이를 설명해주세요.

2 반복문 최적화
Easy

Q. 리스트 안에 특정 값이 존재하는지 확인하는 작업을 수천 번 반복해야 합니다. 리스트 대신 어떤 자료구조를 사용하면 성능을 개선할 수 있으며, 그 이유는 무엇인가요?

조회 연산의 시간 복잡도가 O(1)인 자료구조를 생각해보세요.

A. 모범답안

리스트에서 값을 찾는 in 연산은 O(n) 시간 복잡도를 가지므로 전체 리스트를 순회해야 합니다. 반면 set이나 dict는 해시 테이블로 구현되어 있어 평균 O(1) 시간에 조회가 가능합니다. 수천 번 반복 시 리스트는 O(n*m), set은 O(m)의 차이가 발생합니다. 따라서 중복이 없고 순서가 중요하지 않은 경우 set으로 변환하여 사용하면 성능이 크게 향상됩니다. 실무에서는 화이트리스트 검증, 중복 제거 등에 활용됩니다.

핵심 포인트
  • • 리스트 in 연산은 O(n), set/dict는 O(1)
  • • 반복 조회 시 성능 차이가 누적됨
  • • set은 해시 테이블 기반으로 빠른 조회 제공
  • • 중복 없고 순서 불필요한 경우 set 사용
답변에 넣으면 좋은 키워드
set 시간 복잡도 O(1) 해시 테이블 조회 성능
실무에서는

사용자 권한 체크, 블랙리스트/화이트리스트 검증, 태그 필터링 등에서 사용됩니다.

Follow-up 질문

딕셔너리의 키 조회가 빠른 이유를 해시 함수 관점에서 설명해주세요.

3 데이터베이스 쿼리 최적화
Medium

Q. Django ORM에서 1000개의 주문(Order)을 조회하고 각 주문의 사용자(User) 이름을 출력하는 코드를 작성했는데, 쿼리가 1001번 실행되는 N+1 문제가 발생했습니다. 이 문제의 원인과 해결 방법을 설명해주세요.

외래키로 연결된 관련 객체를 미리 함께 가져오는 ORM 메서드를 생각해보세요.

A. 모범답안

N+1 문제는 주문 1000개를 가져오는 1번의 쿼리 후, 각 주문마다 사용자 정보를 가져오기 위해 추가로 1000번의 쿼리가 실행되는 현상입니다. Django ORM에서 외래키 접근 시 지연 로딩(lazy loading)이 기본이기 때문에 발생합니다. select_related()를 사용하면 SQL JOIN을 통해 연관된 객체를 한 번의 쿼리로 함께 가져옵니다. 예를 들어 Order.objects.select_related('user')를 사용하면 1001번의 쿼리가 1번으로 줄어들어 데이터베이스 부하와 응답 시간이 크게 개선됩니다.

핵심 포인트
  • • N+1 문제는 연관 객체마다 추가 쿼리 발생
  • • 지연 로딩이 기본 동작이므로 발생
  • • select_related()로 JOIN하여 한 번에 조회
  • • 쿼리 수를 N+1에서 1로 감소
답변에 넣으면 좋은 키워드
N+1 문제 select_related 지연 로딩 JOIN 쿼리 최적화
실무에서는

게시글 목록과 작성자 정보, 주문 내역과 고객 정보를 함께 보여주는 API에서 필수적으로 사용됩니다.

Follow-up 질문

ManyToMany 관계에서는 select_related 대신 어떤 메서드를 사용해야 하나요?

4 응답 시간 최적화
Medium

Q. 외부 API를 10번 호출해야 하는 작업이 있는데, 순차적으로 실행하니 총 10초가 걸립니다. Python의 비동기 처리를 활용하여 이 작업을 최적화하는 방법과, asyncio 또는 concurrent.futures를 사용하는 경우의 차이점을 설명해주세요.

여러 작업을 동시에 실행하여 대기 시간을 중첩시키는 방법을 생각해보세요.

A. 모범답안

순차 실행은 각 API 응답을 기다리는 동안 CPU가 유휴 상태가 되어 비효율적입니다. asyncio와 aiohttp를 사용하면 비동기 I/O로 여러 요청을 동시에 보내고 응답을 기다리는 동안 다른 작업을 처리할 수 있어 1초 내외로 단축됩니다. concurrent.futures의 ThreadPoolExecutor는 멀티스레딩으로 병렬 처리하며 기존 동기 라이브러리를 그대로 사용할 수 있습니다. I/O 바운드 작업에서는 두 방법 모두 효과적이지만, asyncio는 단일 스레드에서 이벤트 루프로 동작하여 메모리 효율이 더 좋고, ThreadPoolExecutor는 기존 코드 수정이 적다는 장점이 있습니다.

핵심 포인트
  • • 순차 실행은 I/O 대기 시간이 누적됨
  • • asyncio는 비동기 I/O로 동시 처리
  • • ThreadPoolExecutor는 멀티스레딩으로 병렬 처리
  • • I/O 바운드 작업에서 실행 시간 대폭 단축
답변에 넣으면 좋은 키워드
asyncio concurrent.futures 비동기 I/O 병렬 처리 I/O 바운드
실무에서는

여러 마이크로서비스 API 호출, 대량 이메일 발송, 크롤링 작업에서 응답 시간을 단축하는 데 사용됩니다.

Follow-up 질문

CPU 바운드 작업에서는 어떤 방법을 사용해야 하며, GIL은 어떤 영향을 미치나요?

5 캐싱 전략
Medium

Q. Django 애플리케이션에서 상품 상세 정보를 보여주는 API의 응답 시간이 느립니다. 데이터베이스 조회는 빠르지만, 복잡한 계산과 직렬화 과정이 병목입니다. 이 경우 어떤 캐싱 전략을 사용해야 하며, Django의 캐시 프레임워크를 활용하는 방법을 설명해주세요.

계산된 결과를 메모리에 저장해두고 재사용하는 방법을 생각해보세요.

A. 모범답안

복잡한 계산 결과를 매번 수행하는 것은 비효율적이므로 뷰 레벨 또는 데이터 레벨 캐싱을 적용해야 합니다. Django의 cache.get()과 cache.set()을 사용하여 상품 ID를 키로 계산 결과를 Redis나 Memcached에 저장합니다. 첫 요청에서는 계산 후 캐시에 저장하고, 이후 요청에서는 캐시에서 바로 반환하여 응답 시간을 수십 배 단축할 수 있습니다. TTL(Time To Live)을 설정하여 일정 시간 후 자동 만료시키고, 상품 정보 수정 시 cache.delete()로 무효화하여 데이터 일관성을 유지합니다. @cache_page 데코레이터나 template fragment 캐싱도 상황에 따라 활용 가능합니다.

핵심 포인트
  • • 계산 결과를 캐시에 저장하여 재사용
  • • cache.get/set으로 수동 제어 또는 데코레이터 사용
  • • TTL 설정으로 자동 만료 관리
  • • 데이터 변경 시 캐시 무효화 필요
답변에 넣으면 좋은 키워드
캐싱 Redis Memcached TTL cache.get cache.set 무효화
실무에서는

상품 상세 페이지, 인기 게시글, 통계 대시보드 등 읽기가 많고 변경이 적은 데이터에 사용됩니다.

Follow-up 질문

캐시 워밍(Cache Warming)이란 무엇이며, 언제 사용해야 하나요?

6 데이터베이스 연결 관리
Medium

Q. 트래픽이 증가하면서 데이터베이스 연결 수가 한계에 도달하여 'Too many connections' 오류가 발생합니다. 커넥션 풀(Connection Pool)이 무엇이며, Python 애플리케이션에서 어떻게 설정하여 이 문제를 해결할 수 있는지 설명해주세요.

매번 새로운 연결을 생성하지 않고, 미리 만들어둔 연결을 재사용하는 방법을 생각해보세요.

A. 모범답안

매 요청마다 데이터베이스 연결을 생성하고 해제하면 오버헤드가 크고 연결 수가 급증합니다. 커넥션 풀은 미리 일정 수의 연결을 생성하여 풀에 보관하고, 요청 시 풀에서 빌려주고 완료 후 반환하는 방식입니다. Django의 CONN_MAX_AGE 설정으로 연결을 재사용하거나, SQLAlchemy의 pool_size와 max_overflow로 풀 크기를 조정합니다. 이를 통해 연결 생성 비용을 줄이고, 동시 연결 수를 제한하여 데이터베이스 부하를 조절할 수 있습니다. 적절한 풀 크기는 애플리케이션 워커 수와 데이터베이스 최대 연결 수를 고려하여 설정합니다.

핵심 포인트
  • • 매번 연결 생성/해제는 오버헤드가 큼
  • • 커넥션 풀은 연결을 재사용하여 효율성 증대
  • • Django CONN_MAX_AGE, SQLAlchemy pool_size 설정
  • • 동시 연결 수 제한으로 데이터베이스 보호
답변에 넣으면 좋은 키워드
커넥션 풀 CONN_MAX_AGE pool_size 연결 재사용 데이터베이스 연결
실무에서는

고트래픽 웹 서비스에서 데이터베이스 연결 관리와 성능 최적화를 위해 필수적으로 사용됩니다.

Follow-up 질문

커넥션 풀 크기를 너무 크게 설정하면 어떤 문제가 발생할 수 있나요?

7 응답 크기 최적화
Easy

Q. REST API에서 게시글 목록을 조회할 때, 모든 필드를 반환하니 응답 크기가 너무 커서 네트워크 전송 시간이 오래 걸립니다. 응답 크기를 줄이기 위한 방법들을 설명해주세요.

필요한 필드만 선택하거나, 데이터 압축을 고려해보세요.

A. 모범답안

응답 크기를 줄이기 위해 첫째, 필요한 필드만 선택하여 반환합니다. Django ORM의 only()나 values()로 특정 컬럼만 조회하고, Serializer에서 fields 옵션으로 필드를 제한합니다. 둘째, 페이지네이션을 적용하여 한 번에 전송하는 데이터 양을 줄입니다. 셋째, HTTP 압축(gzip)을 활성화하여 JSON 응답을 압축 전송하면 70~80% 크기 감소 효과가 있습니다. 넷째, 불필요한 중첩 객체는 ID만 반환하거나 별도 엔드포인트로 분리합니다. 이러한 방법들을 조합하면 네트워크 전송 시간과 대역폭을 크게 절약할 수 있습니다.

핵심 포인트
  • • 필요한 필드만 선택하여 반환 (only, values)
  • • 페이지네이션으로 데이터 양 제한
  • • gzip 압축으로 전송 크기 감소
  • • 중첩 객체 최소화 또는 ID만 반환
답변에 넣으면 좋은 키워드
응답 크기 only values 페이지네이션 gzip 압축 필드 선택
실무에서는

모바일 앱 API, 대용량 목록 조회, 느린 네트워크 환경에서 응답 속도를 개선하는 데 사용됩니다.

Follow-up 질문

GraphQL을 사용하면 이 문제를 어떻게 해결할 수 있나요?

8 부하 테스트
Medium

Q. 개발한 API를 프로덕션에 배포하기 전에 성능을 검증하고 싶습니다. Python에서 사용할 수 있는 부하 테스트 도구와, 어떤 지표를 측정하고 분석해야 하는지 설명해주세요.

동시 사용자 수를 시뮬레이션하고 응답 시간, 처리량 등을 측정하는 도구를 생각해보세요.

A. 모범답안

Locust는 Python 기반 부하 테스트 도구로 코드로 시나리오를 작성하고 웹 UI로 실시간 모니터링이 가능합니다. 측정해야 할 주요 지표는 첫째, 응답 시간(평균, 중앙값, 95/99 백분위수)으로 사용자 체감 속도를 파악합니다. 둘째, 처리량(RPS, Requests Per Second)으로 초당 처리 가능한 요청 수를 확인합니다. 셋째, 에러율로 시스템 안정성을 점검합니다. 넷째, 동시 사용자 수를 점진적으로 증가시키며 성능 한계점을 찾습니다. 이를 통해 병목 지점을 파악하고 목표 성능(예: 95 백분위 응답 시간 200ms 이하)을 충족하는지 검증합니다.

핵심 포인트
  • • Locust 등으로 부하 테스트 수행
  • • 응답 시간, 처리량, 에러율 측정
  • • 백분위수로 사용자 체감 성능 파악
  • • 점진적 부하 증가로 한계점 탐색
답변에 넣으면 좋은 키워드
Locust 부하 테스트 RPS 백분위수 응답 시간 처리량
실무에서는

서비스 출시 전 성능 검증, 프로모션 이벤트 대비 용량 산정, 시스템 확장 계획 수립에 사용됩니다.

Follow-up 질문

부하 테스트 결과 CPU 사용률은 낮은데 응답 시간이 느리다면 어떤 원인일 수 있나요?

9 인덱스 활용
Medium

Q. 사용자 검색 기능에서 WHERE 절에 LIKE '%keyword%' 조건을 사용했더니, 인덱스가 있는데도 쿼리가 느립니다. 이 문제의 원인과 전문 검색(Full-Text Search)을 활용한 해결 방법을 설명해주세요.

와일드카드 위치와 인덱스 활용 가능 여부를 생각해보세요.

A. 모범답안

LIKE '%keyword%'는 앞쪽 와일드카드 때문에 인덱스를 활용할 수 없어 전체 테이블 스캔이 발생합니다. 인덱스는 정렬된 구조이므로 앞부분이 확정되어야 활용 가능하지만, 앞쪽 %는 모든 값을 검사해야 합니다. 해결 방법으로는 PostgreSQL의 Full-Text Search나 Elasticsearch 같은 전문 검색 엔진을 사용합니다. Django에서는 SearchVector와 SearchQuery로 전문 검색을 구현하거나, 별도로 Elasticsearch를 연동합니다. 이를 통해 역인덱스(inverted index)를 활용하여 빠른 검색이 가능하고, 형태소 분석, 유사도 검색 등 고급 기능도 사용할 수 있습니다.

핵심 포인트
  • • LIKE '%keyword%'는 인덱스 활용 불가
  • • 앞쪽 와일드카드는 전체 스캔 유발
  • • Full-Text Search나 Elasticsearch 활용
  • • 역인덱스로 빠른 검색 및 고급 기능 제공
답변에 넣으면 좋은 키워드
LIKE 인덱스 Full-Text Search Elasticsearch 역인덱스 전체 테이블 스캔
실무에서는

게시글 검색, 상품 검색, 사용자 검색 등 텍스트 기반 검색 기능에서 성능을 개선하는 데 사용됩니다.

Follow-up 질문

trigram 인덱스를 사용하면 LIKE 검색 성능을 개선할 수 있나요?

10 프로파일링
Medium

Q. Python 애플리케이션의 특정 API가 느린데, 어느 부분이 병목인지 모르겠습니다. 코드 레벨에서 성능 병목을 찾기 위해 사용할 수 있는 프로파일링 도구와 방법을 설명해주세요.

함수별 실행 시간을 측정하고 분석하는 도구를 생각해보세요.

A. 모범답안

Python의 cProfile 모듈로 함수별 호출 횟수와 실행 시간을 측정할 수 있습니다. python -m cProfile -o output.prof script.py로 실행 후, snakeviz나 gprof2dot으로 시각화하여 병목 함수를 쉽게 파악합니다. Django Debug Toolbar는 개발 환경에서 SQL 쿼리 수와 실행 시간, 캐시 히트율 등을 실시간으로 보여줍니다. line_profiler는 함수 내부의 라인별 실행 시간을 측정하여 더 세밀한 분석이 가능합니다. 프로덕션에서는 APM 도구(New Relic, Datadog)를 사용하여 실시간 모니터링과 분석을 수행합니다. 이러한 도구들로 측정 후 가장 시간이 오래 걸리는 부분을 우선 최적화합니다.

핵심 포인트
  • • cProfile로 함수별 실행 시간 측정
  • • Django Debug Toolbar로 쿼리 분석
  • • line_profiler로 라인별 세밀한 분석
  • • 측정 후 병목 지점 우선 최적화
답변에 넣으면 좋은 키워드
cProfile 프로파일링 Django Debug Toolbar line_profiler 병목 분석 성능 측정
실무에서는

느린 API 원인 파악, 배치 작업 최적화, 성능 개선 전후 비교 분석에 사용됩니다.

Follow-up 질문

메모리 사용량을 프로파일링하려면 어떤 도구를 사용해야 하나요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!