[Python] 성능 병목을 찾는 방법 '프로파일링'
·
Python
LLM 기반 서비스를 개발하다 보면 한 번쯤 이런 상황을 만납니다. 사용자가 질문을 입력했는데 응답까지 15초가 걸립니다. 느리다는 건 알겠는데 왜 느린지는 모르는 상황입니다. LLM이 문제일까요, 벡터 DB 검색이 문제일까요, 아니면 다른 곳일까요?이럴 때 필요한 것이 프로파일링(Profiling) 입니다. 이 글에서는 프로파일링이 무엇인지, 그리고 실무에서 자주 사용하는 두 도구인 py-spy와 pyinstrument를 어떤 상황에서 어떻게 활용하는지 정리합니다.프로파일링이란 무엇인가프로파일링은 프로그램이 실행되는 동안 시간과 자원이 어디에서 얼마나 소비되는지 측정하는 과정입니다. 단순히 전체 실행 시간을 재는 것이 아니라, 어느 함수가 얼마나 오래 실행됐는지, CPU를 얼마나 사용했는지, 어디서 대..
[Python] sort(), reverse()정리
·
Python
주어진 문자열을 내림차순으로 반환하는 코딩 테스트 문제를 푸는 도중 reverse()와 sort() 사용법이 헷갈려서 정리해둔다.sort() vs sorted()공부하다가 제일 헷갈렸던 부분이다. python# sort() - 원본을 바꿔버림arr = [3, 1, 2]arr.sort()print(arr) # [1, 2, 3]# 반환값이 None이라 이렇게 쓰면 안됨!result = arr.sort()print(result) # None python# sorted() - 원본은 그대로, 새 리스트 반환arr = [3, 1, 2]result = sorted(arr)print(arr) # [3, 1, 2] 그대로print(result) # [1, 2, 3]문자열은 sort()를 쓰면 Attri..
[Python] Selenium에서의 innerHTML, innerText, textContent 차이점
·
Python
(1) 문제 상황셀레니움을 활용하여 스타벅스 사이트에 나와있는 점포 정보를 가져오는 프로젝트를 진행 중에코드리뷰를 하면서 get_attribute() 안에 들어올 수 있는 인자들이 다양하게 있다는 것을 알게되어서인자별 차이점을 기록하기 위해 글을 작성합니다. # 주소 address_p = store.find_element(By.CSS_SELECTOR, 'p.result_details') address = address_p.get_attribute('textContent').strip().split('1522-3232')[0].strip() 위 코드에 'textContent'가 있는 부분에 들어갈 수 있는 값을 주목하면서 보시면 될 것 같습니다. (2) innerHTML, innerText, t..
[Python] 정규표현식
·
Python
목차정규표현식이란?Python re 모듈 기초re.compile() — 왜 사용하는가?정규표현식 핵심 문법실전 예제 — HTML 태그 찾기re 옵션 플래그실전 활용 예제그룹 캡처 — 더 강력하게 활용하기 1. 정규표현식이란?정규표현식(Regular Expression, Regex)은 특정 패턴을 가진 문자열을 검색, 추출, 변환하기 위한 형식 언어입니다.단순히 "특정 단어 찾기"를 넘어, 이메일·전화번호·URL처럼 규칙을 가진 문자열 패턴을 정의하고 한 번에 처리할 수 있습니다.쉽게 말하면, 정규표현식은 문자열에 대한 "검색 공식" 입니다.정규표현식을 사용하는 이유코드 10줄로 처리할 작업을 정규표현식 1줄로 끝낼 수 있습니다. 문자열 처리 로직이 복잡할수록 정규표현식의 가치는 극대화됩니다.정규표현식이 ..
[Python] pytest를 이용한 테스트 코드 작성법
·
Python
(1) 문제 상황코드를 짜다 보면 "이 함수 잘 작동하나?" 를 확인하기 위해 직접 print()를 찍어보거나 손으로 실행해보는 일이 반복됩니다.이를 해결하고자 함수가 잘 동작하는지 확인 하기 위해 테스트 코드를 작성하는 방법을 알아보겠습니다.(2) 파일 구조 규칙pytest는 파일을 자동으로 탐색할 때 두 가지 규칙을 따릅니다.테스트 파일명은 반드시 test_로 시작해야 합니다. pytest가 이 패턴으로 테스트 파일을 자동 인식합니다.테스트 함수명도 마찬가지로 test_로 시작해야 pytest가 실행 대상으로 인식합니다.테스트 파일은 별도의 tests/ 폴더에 모아두는 게 일반적인 관례입니다.my_project/├── src/│ └── parser.py # 실제 기능 코드└── te..
[Python] json.dumps() 사용법, 사용이유
·
Python
(1) 서론프로젝트를 진행하다 보면 API를 통해 JSON 형태의 데이터를 받아오는 경우가 많다.나 역시 API를 호출해 데이터를 받아왔는데, 문제는 한 줄로 뭉쳐진 JSON 형태로 전달되어 구조를 파악하기가 매우 어려웠다는 점이었다.처음에는 어떤 키에 어떤 값이 들어있는지 한눈에 보이지 않아 디버깅에도 많은 시간이 걸렸다.이 문제를 해결하기 위해 파이썬의 json.dumps() 함수를 활용해 JSON 데이터를 보기 좋게 정리(pretty print) 하는 방법을 사용하게 되었고, 이번 글에서는 그 사용법을 정리해보고자 한다.(2) 사용법1. 기본 JSON 데이터 예시API에서 받아온 데이터는 보통 아래와 같은 형태로 생겼다. data = {"name":"홍길동","age":25,"address":{"c..
[Python] API 요청 방법
·
Python
(1) API 요청 보내기api를 요청할 때는 보통 requests 라이브러리를 사용한다. 따라서 파일 상단에 import requests 로 라이브러리를 불러온 다음response = requests.get(url, params=파라미터) 로 API를 호출하면 된다.코드를 설명하자면requests.get() → GET 방식으로 요청 보내기첫 번째 인자 → 어디로 보낼지 (url)params= → 같이 보낼 파라미터각각 이런 역할을 한다. 요청하는 방식은 크게 GET, POST, PUT, DELETE로 나뉜다. 용도는 다음과 같다. 방식 용도GET데이터 가져올 때POST데이터 보낼 때..
[Python] 라이브러리 관리하기
·
Python
가상환경을 실행시켜 주었다면, 해당 프로젝트에 맞는 라이브러리들을 설치해주어야 합니다. (1) 문제 상황가상환경을 처음 킨 상태이므로 아직 프로젝트에 필요한 라이브러리가 없을 것입니다.pip list 위 코드를 터미널창에 적용해 보면 다음과 같이 나올 텐데, 위 코드는 현재 설치된 라이브러리를 알려주는 코드이기 때문입니다. (2) 라이브러리 설치 라이브러리를 설치하기 위해선 다음과 같은 코드를 터미널 창에 입력하면 됩니다. 저는 API를 호출해야 하기 때문에 requests라는 라이브러리를 설치하는 것이고,독자분들은 본인의 상황에 맞게 설치해 주시면 됩니다. 프로젝트 종류별 주로 사용하는 라이브러리API 호출requests데이터 분석pandas, numpy데이터베이스sqlalchemy, psycopg2자..
[Python] 리스트 컴프리헨션 & 조건부 표현식 | 코딩 테스트에 자주 나오는 풀이 방식
·
Python
코딩 테스트 풀이 연습 중 자주 사용되는 풀이 방식을 정리해 보았습니다. 리스트 컴프리헨션 & 조건부 표현식1. 리스트 컴프리헨션기본 형태 python[표현식 for 변수 in 반복가능객체 if 조건]예시 python# k보다 큰 값만 필터링candidates = [arr[i] for i in range(s, e+1) if arr[i] > k]# 짝수만 필터링evens = [x for x in numbers if x % 2 == 0]2. 조건부 표현식 (삼항 연산자)기본 형태 python참일때값 if 조건 else 거짓일때값예시 python# 리스트가 비어있으면 -1, 아니면 최솟값answer = min(candidates) if candidates else -1# 양수면 그대로, 음수면 0val..
[Python] 다중 할당 swap
·
Python
(1) 다른 언어에서의 Swap다른 언어(C, Java 등)에서는 두 변수의 값을 교환할 때 임시 변수(temp)가 필수입니다. pythontemp = arr[i]arr[i] = arr[j]arr[j] = temp(2) 파이썬에서의 Swap파이썬에서는 다중 할당을 이용해 한 줄로 해결할 수 있습니다. pythonarr[i], arr[j] = arr[j], arr[i]왜 가능한가?파이썬은 우변을 먼저 튜플로 묶어 평가한 뒤, 좌변에 순서대로 할당하기 때문입니다. 즉, arr[j], arr[i] 를 먼저 (arr[j], arr[i]) 튜플로 만들고 나서 할당하므로 temp 없이도 안전하게 교환됩니다.(3) 정리temp 방식다중 할당 방식코드 길이3줄1줄파이썬 관용성낮음높음 (Pythonic)