Skip to content

Commit 5d6a281

Browse files
committed
Update Standard Library.md
1 parent 1d5f6eb commit 5d6a281

File tree

1 file changed

+192
-3
lines changed

1 file changed

+192
-3
lines changed

docs/Standard Library.md

Lines changed: 192 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
# **Standard Library**
22

3-
Python이 기본 제공하는 모듈들
3+
Python이 기본 제공하는 모듈들
44

55
## **1. collections**
6+
67
Python의 `collections` 모듈은 다양한 데이터 구조를 쉽게 다룰 수 있도록 도와줌.
78

89
Counter, defaultdict, deque, OrderedDict, namedtuple 등이 자주 사용된다.
910

1011
### 1.1 **collections.Counter (요소 개수 세기)**
12+
1113
리스트 요소의 개수를 쉽게 세는 기능.
1214

1315
#### dict 사용
16+
1417
```python
1518
words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
1619
word_count = {}
@@ -25,6 +28,7 @@ print(word_count)
2528
- dict를 사용하면 키가 존재하는지 매번 확인해야 하므로 코드가 복잡하고 비효율적.
2629

2730
#### collections.Counter 사용
31+
2832
```python
2933
from collections import Counter
3034

@@ -36,9 +40,11 @@ print(word_count)
3640
- 내부적으로 최적화되어 있어 요소 개수를 더 빠르고 간결하게 계산.
3741

3842
### 1.2 **collections.deque (빠른 리스트 연산)**
43+
3944
앞쪽 원소 삽입/삭제 시 `list`는 O(n)이지만 `deque`는 O(1)로 동작.
4045

4146
#### 리스트 사용 (비효율적)
47+
4248
```python
4349
lst = [1, 2, 3]
4450
lst.insert(0, 0) # O(n) 연산
@@ -48,6 +54,7 @@ lst.pop(0) # O(n) 연산
4854
- list는 앞쪽 원소를 삽입/삭제할 때 모든 요소를 이동해야 하므로 O(n) 시간이 걸림.
4955

5056
#### deque 사용 (효율적)
57+
5158
```python
5259
from collections import deque
5360

@@ -59,13 +66,15 @@ dq.popleft() # O(1)
5966
- deque는 양쪽 끝에서 O(1)로 삽입/삭제 가능하여 효율적.
6067

6168
## **2. itertools**
69+
6270
반복 가능한 객체를 다루는 다양한 기능 제공.
6371

64-
count, cycle, chain, permutations, starmap 등을 사용하여 반복문과 조건문을 간단하고 효율적으로 처리할 수 있도록 도와준다.
72+
count, cycle, chain, permutations, starmap 등을 사용하여 반복문과 조건문을 간단하고 효율적으로 처리할 수 있도록 도와줌.
6573

6674
### 2.1 **itertools.permutations (순열 조합 구하기)**
6775

6876
#### 재귀 함수 사용
77+
6978
```python
7079
def permute(arr, path=[]):
7180
if not arr:
@@ -80,6 +89,7 @@ permute([1, 2, 3])
8089
- 재귀 호출로 인해 비효율적이고 코드가 길어짐.
8190

8291
#### itertools.permutations 사용
92+
8393
```python
8494
from itertools import permutations
8595

@@ -91,9 +101,11 @@ print(perm_list)
91101
- 내부적으로 최적화되어 간결하고 빠름.
92102

93103
### 2.2 **itertools.starmap (튜플 언패킹 최적화)**
104+
94105
`map()` 대신 사용하면 성능 향상.
95106

96107
#### 일반 map() 사용
108+
97109
```python
98110
def add(a, b):
99111
return a + b
@@ -105,6 +117,7 @@ result = list(map(lambda x: add(*x), pairs))
105117
- lambda로 언패킹해야 함.
106118

107119
#### starmap() 사용
120+
108121
```python
109122
from itertools import starmap
110123

@@ -118,13 +131,15 @@ result = list(starmap(add, pairs))
118131
- 불필요한 lambda 호출을 줄여 성능이 향상됨.
119132

120133
## **3. functools**
134+
121135
함수 최적화 및 고차 함수 지원.
122136

123137
lru_cache, partial, reduce, update_wrapper, total_ordering 등 여러 고차 함수들을 통해 반복적인 작업을 최적화하고, 코드의 가독성 및 재사용성을 높이는 데 유용하다.
124138

125139
### 3.1 **functools.lru_cache (재귀 최적화)**
126140

127141
#### 사용하지 않음 (느림)
142+
128143
```python
129144
def fib(n):
130145
if n <= 1:
@@ -138,6 +153,7 @@ print(fib(30)) # 매우 느림
138153
- 호출 깊이가 커질수록 기하급수적으로 느려짐
139154

140155
#### lru_cache 사용 (빠름)
156+
141157
```python
142158
from functools import lru_cache
143159

@@ -154,6 +170,7 @@ print(fib(30)) # 훨씬 빠름
154170
- 불필요한 연산을 제거해 실행 속도 대폭 향상
155171

156172
## **4. datetime**
173+
157174
날짜 및 시간 다루기.
158175

159176
날짜, 시간, 시간 차이, 시간대 변환 등을 손쉽게 처리할 수 있는 기능을 제공한다.
@@ -163,6 +180,7 @@ datetime 객체의 메소드를 사용하면 날짜와 시간 연산을 간단
163180
### 4.1 **datetime.datetime (시간 정보 가져오기)**
164181

165182
#### time 사용
183+
166184
```python
167185
import time
168186

@@ -174,6 +192,7 @@ print(f"현재 연도: {int(year)}")
174192
- Unix 타임스탬프를 직접 변환 → 연도 계산이 번거롭고 가독성 낮음
175193

176194
#### datetime 사용
195+
177196
```python
178197
from datetime import datetime
179198

@@ -184,6 +203,7 @@ print(f"현재 연도: {now.year}")
184203
- 즉시 연도 반환
185204

186205
## **5. pathlib**
206+
187207
파일 시스템 경로 다루기.
188208

189209
pathlib는 파일 경로를 다루는 다양한 메소드를 제공한다. 예를 들어, joinpath()로 경로를 이어 붙이거나, stem, suffix와 같은 속성을 이용해 파일명이나 확장자도 쉽게 다룰 수 있다.
@@ -193,6 +213,7 @@ pathlib는 파일 경로를 다루는 다양한 메소드를 제공한다. 예
193213
### 5.1 **pathlib.Path (파일 존재 여부 확인)**
194214

195215
#### os 사용
216+
196217
```python
197218
import os
198219

@@ -204,6 +225,7 @@ if os.path.exists(filepath):
204225
- 문자열 경로 처리
205226

206227
#### pathlib.Path 사용
228+
207229
```python
208230
from pathlib import Path
209231

@@ -215,20 +237,23 @@ if filepath.exists():
215237
- Path 객체 사용 → 경로 조작이 직관적이고 가독성 향상
216238

217239
## **6. array**
240+
218241
메모리 효율적인 배열 사용.
219242

220243
메모리 절약, 인덱스 접근 속도 향상 등의 장점도 있지만 데이터 타입을 고정해야 하므로, 서로 다른 데이터 타입을 저장할 수 있는 리스트보다 유연성이 떨어진다.
221244

222245
### 6.1 **array.array**
223246

224247
#### 리스트 사용 (비효율적)
248+
225249
```python
226250
lst = [1, 2, 3, 4, 5] # 객체 포인터 저장
227251
```
228252

229253
- 객체 포인터 저장 → 메모리 사용량 증가
230254

231255
#### array 사용 (효율적)
256+
232257
```python
233258
from array import array
234259

@@ -242,6 +267,7 @@ arr = array('i', [1, 2, 3, 4, 5]) # 'i'는 정수(int) 타입 지정
242267
### 7.1 **multiprocessing (CPU 병렬 처리)**
243268

244269
#### 단일 프로세스 실행 (느림)
270+
245271
```python
246272
def work(n):
247273
return sum(i*i for i in range(n))
@@ -253,6 +279,7 @@ results = [work(n) for n in nums] # 한 개씩 실행 (느림)
253279
- 한 번에 하나씩 처리 → CPU 코어 활용 부족
254280

255281
#### multiprocessing 사용 (빠름)
282+
256283
```python
257284
from multiprocessing import Pool
258285

@@ -269,6 +296,7 @@ with Pool() as pool:
269296
### 7.2 **concurrent.futures.ThreadPoolExecutor (I/O 최적화)**
270297

271298
#### 단일 스레드 실행 (느림)
299+
272300
```python
273301
import requests
274302

@@ -282,6 +310,7 @@ for url in urls:
282310
- 한 번에 하나씩 처리 → I/O 작업에 시간이 많이 소요됨
283311

284312
#### ThreadPoolExecutor 사용 (빠름)
313+
285314
```python
286315
from concurrent.futures import ThreadPoolExecutor
287316
import requests
@@ -295,4 +324,164 @@ for response in results:
295324
print(response.status_code)
296325
```
297326

298-
- 여러 스레드에서 병렬 실행 → I/O 대기 시간 동안 다른 요청 처리 가능, 속도 향상
327+
- 여러 스레드에서 병렬 실행 → I/O 대기 시간 동안 다른 요청 처리 가능, 속도 향상
328+
329+
## **8. heapq**
330+
331+
우선순위 큐 알고리즘 구현 시 사용되는 최소 힙 기반의 모듈.
332+
333+
### 8.1 **heapq.heappush / heappop (우선순위 큐 구현)**
334+
335+
리스트를 최소 힙처럼 사용 가능.
336+
337+
#### 리스트 정렬 방식 (비효율적)
338+
339+
```python
340+
lst = [3, 1, 2]
341+
lst.sort() # 최소값을 꺼내기 위해 정렬 필요
342+
min_val = lst.pop(0) # O(n)
343+
```
344+
345+
- 최소값 추출 시 정렬 필요 → 비효율적
346+
347+
#### heapq 사용 (효율적)
348+
349+
```python
350+
import heapq
351+
352+
heap = []
353+
heapq.heappush(heap, 3)
354+
heapq.heappush(heap, 1)
355+
heapq.heappush(heap, 2)
356+
357+
print(heapq.heappop(heap)) # 1
358+
```
359+
360+
- 최소값 추출이 O(log n)으로 효율적
361+
- 다익스트라, 작업 스케줄링 문제에 활용됨
362+
363+
## **9. bisect**
364+
365+
정렬된 리스트에 이진 탐색 기반 삽입/탐색 기능 제공.
366+
367+
### 9.1 **bisect.bisect / bisect.insort (이진 삽입/탐색)**
368+
369+
#### 일반 삽입 (비효율적)
370+
371+
```python
372+
lst = [1, 3, 4, 6]
373+
lst.append(5)
374+
lst.sort() # 정렬 다시 수행 → 비효율적
375+
```
376+
377+
#### bisect 사용 (효율적)
378+
379+
```python
380+
import bisect
381+
382+
arr = [1, 3, 4, 6]
383+
bisect.insort(arr, 5) # 정렬된 상태 유지
384+
print(arr) # [1, 3, 4, 5, 6]
385+
386+
idx = bisect.bisect(arr, 4)
387+
print(idx) # 3 (4가 삽입될 위치)
388+
```
389+
390+
- 정렬 리스트에서 이진 탐색으로 빠르게 삽입/탐색
391+
392+
## **10. math**
393+
394+
수학 연산 지원 (루트, 팩토리얼, 최대공약수 등).
395+
396+
### 10.1 **math.sqrt / factorial / gcd (수학 함수)**
397+
398+
```python
399+
import math
400+
401+
print(math.sqrt(16)) # 4.0
402+
print(math.factorial(5)) # 120
403+
print(math.gcd(12, 18)) # 6
404+
```
405+
406+
- 수학 문제, 알고리즘 구현 시 유용
407+
408+
## **11. statistics**
409+
410+
기초 통계 계산을 위한 모듈.
411+
412+
### 11.1 **statistics.mean / median (평균/중앙값)**
413+
414+
```python
415+
import statistics
416+
417+
data = [1, 2, 3, 4, 5]
418+
print(statistics.mean(data)) # 3
419+
print(statistics.median(data)) # 3
420+
```
421+
422+
- 데이터 분석, 요약 통계에 적합
423+
424+
## **12. enum**
425+
426+
열거형 상수를 정의할 수 있는 모듈.
427+
428+
### 12.1 **Enum 클래스 (가독성 있는 상수 정의)**
429+
430+
```python
431+
from enum import Enum
432+
433+
class Color(Enum):
434+
RED = 1
435+
GREEN = 2
436+
BLUE = 3
437+
438+
print(Color.RED) # Color.RED
439+
print(Color.RED.value) # 1
440+
```
441+
442+
- 의미 있는 값 이름으로 가독성 향상
443+
444+
## **13. pprint**
445+
446+
복잡한 자료구조를 보기 좋게 출력할 때 사용.
447+
448+
### 13.1 **pprint.pprint (딕셔너리 예쁘게 출력)**
449+
450+
```python
451+
from pprint import pprint
452+
453+
data = {"users": [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]}
454+
pprint(data)
455+
```
456+
457+
- 중첩 구조를 보기 좋게 정렬하여 출력
458+
459+
## **14. textwrap**
460+
461+
긴 문자열을 줄 바꿈 등으로 포맷팅.
462+
463+
### 14.1 **textwrap.fill (자동 줄바꿈)**
464+
465+
```python
466+
import textwrap
467+
468+
text = "Python is an interpreted high-level general-purpose programming language."
469+
print(textwrap.fill(text, width=30))
470+
```
471+
472+
- CLI/터미널에서 텍스트 출력 시 유용
473+
474+
## **15. uuid**
475+
476+
전역 고유 식별자(UUID) 생성에 사용.
477+
478+
### 15.1 **uuid.uuid4 (고유값 생성)**
479+
480+
```python
481+
import uuid
482+
483+
unique_id = uuid.uuid4()
484+
print(unique_id)
485+
```
486+
487+
- 고유한 파일명, 데이터 식별자 생성 시 사용

0 commit comments

Comments
 (0)