Python 리스트 효율적으로 나누기: chunks
함수 만들기 가이드
데이터를 다루다 보면 리스트를 일정한 크기로 나누어 처리해야 하는 상황이 자주 발생합니다. 예를 들어, 방대한 양의 데이터가 담긴 리스트를 한꺼번에 처리하지 않고, 적당한 크기로 쪼개서 효율적으로 작업할 수 있으면 좋겠죠? 바로 그럴 때 유용한 것이 chunks
함수입니다.
이번 글에서는 리스트를 효율적으로 나누어 처리하는 chunks
함수를 만들고 활용하는 방법을 살펴보겠습니다.
왜 chunks
함수가 필요할까?
리스트를 처리할 때 한 번에 모든 데이터를 처리하려면 메모리 소모가 크고 처리 시간이 오래 걸릴 수 있습니다. 특히 데이터가 방대할 때 이 문제가 더욱 심각해지죠. 이를 해결하기 위해 리스트를 적당한 크기로 잘라서 나눠 처리하면, 메모리 사용량과 처리 시간을 절약할 수 있습니다. chunks
함수는 바로 이러한 목적을 위한 도구입니다.
기본 chunks
함수 만들기
Python에서 리스트를 일정한 크기로 나누기 위해, chunks
함수를 작성할 수 있습니다. 아래의 예제는 리스트를 n
개씩 나누어 반환하는 chunks
함수를 보여줍니다.
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
# 리스트 나누기 예제
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
for chunk in chunks(data, 3):
print(chunk)
결과
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
설명
chunks
함수는yield
를 사용해 리스트를 나눕니다. 한 번에 리스트의 일부만 반환하여 메모리 사용을 절약할 수 있습니다.range(0, len(lst), n)
는 리스트를n
개씩 건너뛰며 인덱스를 생성하므로, 각 인덱스마다lst[i:i + n]
부분을 잘라 반환합니다.- 이렇게
yield
를 활용해 필요한 부분만 호출할 때마다 전달하므로 큰 리스트도 메모리 효율적으로 나눌 수 있습니다.
chunks
함수를 이용한 대용량 데이터 처리
큰 데이터 처리를 위해, chunks
함수는 매우 유용합니다. 예를 들어, 대량의 데이터를 한꺼번에 DB에 저장하기보다 일정 크기로 나누어 처리하면 훨씬 효율적입니다. 아래 예제에서는 데이터베이스에 저장하기 위해 데이터를 chunks
함수로 나누는 방식입니다.
def save_to_database(chunk):
print(f"Saving chunk: {chunk}") # 실제 코드에서는 DB 저장 로직이 들어갑니다
data = list(range(1, 101)) # 1부터 100까지의 숫자 리스트
# 데이터 10개씩 나누어 처리
for chunk in chunks(data, 10):
save_to_database(chunk)
결과 (출력 일부 예시)
Saving chunk: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Saving chunk: [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
...
Saving chunk: [91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
설명
save_to_database(chunk)
함수를 통해 각 조각을 데이터베이스에 저장하는 예제입니다.- 데이터가 많을 경우 한 번에 처리하지 않고, 10개씩 나누어 저장하여 메모리 부담을 줄이고, 처리 효율을 높입니다.
리스트를 동적으로 나누기: chunks
와 제너레이터의 장점
chunks
함수를 제너레이터로 만들면, 큰 데이터를 나누어 사용할 때 메모리 효율이 크게 향상됩니다. 일반적인 리스트 슬라이싱으로 쪼개면 모든 조각을 메모리에 올리게 되어 메모리가 부족해질 수 있지만, yield
를 사용한 chunks
함수는 필요할 때마다 데이터를 순차적으로 생성합니다.
# 아주 큰 리스트 생성
big_data = range(1, 1000001) # 1부터 1,000,000까지의 숫자
# 100,000개씩 나누어 출력
for i, chunk in enumerate(chunks(big_data, 100000), 1):
print(f"Chunk {i}: Size = {len(chunk)}")
결과
Chunk 1: Size = 100000
Chunk 2: Size = 100000
...
Chunk 10: Size = 100000
설명
- 이 예제는 1,000,000개의 숫자를
chunks
함수로 100,000개씩 나누어 출력하는 예제입니다. yield
를 사용했기 때문에 큰 데이터를 효율적으로 처리할 수 있으며, 메모리 사용량을 줄일 수 있습니다.
chunks
함수의 또 다른 활용: 데이터 분석
데이터 분석 작업에서도 chunks
함수는 매우 유용하게 사용됩니다. 예를 들어, CSV 파일에서 데이터를 읽어올 때 데이터를 일정 크기로 나누어 처리하면 데이터 분석 속도와 효율성을 개선할 수 있습니다.
import csv
def read_csv_in_chunks(file_path, chunk_size):
with open(file_path, "r") as file:
reader = csv.reader(file)
chunk = []
for row in reader:
chunk.append(row)
if len(chunk) == chunk_size:
yield chunk
chunk = []
if chunk: # 마지막 남은 데이터 반환
yield chunk
# CSV 파일 읽기
for chunk in read_csv_in_chunks("data.csv", 100):
print(f"Processing chunk with {len(chunk)} rows")
설명
read_csv_in_chunks
함수는chunk_size
크기만큼 데이터를 모아, 읽은 데이터를 한 번에 반환합니다.yield
를 사용해 중간 중간 결과를 반환하므로, 큰 CSV 파일도 효율적으로 나눠 처리할 수 있습니다.
다양한 크기로 리스트 쪼개기: chunks
함수의 유연성
리스트 크기가 일정하지 않더라도 다양한 크기로 조정할 수 있습니다. 이 방식은 고정 크기로 나누는 경우보다 유연하게 쪼갤 수 있어 더 다양한 작업에 활용할 수 있습니다.
def variable_chunks(lst, sizes):
index = 0
for size in sizes:
yield lst[index:index + size]
index += size
# 예시 데이터와 크기
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sizes = [2, 3, 5]
for chunk in variable_chunks(data, sizes):
print(chunk)
결과
[1, 2]
[3, 4, 5]
[6, 7, 8, 9, 10]
설명
variable_chunks
함수는 리스트data
를sizes
리스트의 크기에 맞춰 유연하게 나눕니다.- 각 조각은
sizes
리스트에 지정한 크기에 따라 생성됩니다.
요약: Python의 chunks
함수로 리스트를 효율적으로 나누기
chunks
함수는 특히 대규모 데이터를 나누어 처리할 때 효율적입니다. yield
를 사용해 제너레이터로 만든 덕분에 메모리 사용량을 절약하며, 필요한 크기만큼 데이터를 쪼개서 사용할 수 있습니다.
활용 요약
- 큰 리스트를 일정 크기로 나누어 메모리 사용을 최적화할 수 있습니다.
- 제너레이터를 활용해 무거운 작업도 메모리 부담을 줄여 효율적으로 처리할 수 있습니다.
- 데이터 분석, 데이터베이스 저장과 같은 데이터 중심 작업에서 유용하게 활용할 수 있습니다.
이제 chunks
함수를 활용해 데이터를 효율적으로 나누고, 코드를 더 깔끔하고 효율적으로 작성해 보세요!
'개발 > Python 스터디' 카테고리의 다른 글
[Python] `ChainMap`으로 중첩 딕셔너리 깔끔하게 다루기: 딕셔너리 합치기의 종결자 (0) | 2024.11.19 |
---|---|
[Python] `lambda` 완벽 가이드: 익명 함수로 코드 간결하게 만들기 (0) | 2024.11.18 |
[Python] `defaultdict`로 편리한 딕셔너리 생성: 기본값으로 딕셔너리 쉽게 관리하기 (0) | 2024.11.12 |
[Python] `zip`과 `zip_longest`로 두 리스트 병합하기: 짝 맞추기 대작전 (0) | 2024.11.11 |
[Python] `enumerate`로 간편하게 인덱스 추적하기: 인덱스와 값 모두 쉽게 관리하기 (0) | 2024.11.10 |