에코프로.AI

[python] Python 메모리 최적화 기법: 효율적인 코드를 위한 11가지 팁 본문

AI Tutorial

[python] Python 메모리 최적화 기법: 효율적인 코드를 위한 11가지 팁

AI_HitchHiker 2024. 11. 14. 22:29

 

DALL-E 에서 생성된 이미지입니다.( python메모리관리 에 관한 블로그글의 헤더 이미지 생성해줘.)

 

Python 프로그램의 메모리 사용을 최적화하는 방법에 대해 알아보겠습니다. 특히 Pandas DataFrame을 사용할 때 메모리를 효율적으로 관리하는 방법도 포함하여 설명하겠습니다.

 

1. 제너레이터 사용하기

제너레이터는 필요할 때만 데이터를 생성하므로 메모리를 크게 절약할 수 있습니다.

# 리스트 사용 (메모리 비효율적)
numbers_list = [i for i in range(1000000)]

# 제너레이터 사용 (메모리 효율적)
numbers_generator = (i for i in range(1000000))

 

2. 불필요한 객체 삭제하기

del 키워드를 사용하여 더 이상 필요하지 않은 객체를 삭제할 수 있습니다.

a = [1, 2, 3, 4, 5, ..., 100000000]
# 객체 사용 후
del a

 

3. 효율적인 데이터 구조 선택하기

상황에 따라 적절한 데이터 구조를 선택하는 것이 중요합니다.

예를 들어, 튜플은 리스트보다 메모리를 덜 사용합니다.

import sys

my_tuple = (1, 2, 3, 4, 5)
my_list = [1, 2, 3, 4, 5]

print(sys.getsizeof(my_tuple))  # 80
print(sys.getsizeof(my_list))   # 120

 

4. 전역 변수 사용 최소화하기

전역 변수는 프로그램 수명 전체 동안 메모리를 점유하므로, 가능한 한 지역 변수를 사용하는 것이 좋습니다.

# 비효율적인 방법
global_var = [i for i in range(1000000)]

def process_data():
    for item in global_var:
        # 처리 로직

# 효율적인 방법
def process_data():
    local_var = (i for i in range(1000000))
    for item in local_var:
        # 처리 로직

 

5. 문자열 연결 시 join() 메소드 사용하기

문자열은 불변이므로, '+' 연산자로 연결하면 매번 새로운 문자열 객체가 생성됩니다. 

join() 메소드를 사용하면 더 효율적입니다.

# 비효율적인 방법
result = ''
for i in range(1000):
    result += str(i)

# 효율적인 방법
result = ''.join(str(i) for i in range(1000))

 

6. 대용량 데이터 처리 시 청크 단위로 읽기

대용량 파일을 처리할 때는 전체를 한 번에 메모리에 로드하지 않고, 청크 단위로 읽는 것이 효율적입니다.

import pandas as pd

# 비효율적인 방법
df = pd.read_csv('large_file.csv')

# 효율적인 방법
chunk_size = 10000
for chunk in pd.read_csv('large_file.csv', chunksize=chunk_size):
    # 청크 단위로 처리

 

7. 가비지 컬렉션 수동 제어하기

필요한 경우 gc 모듈을 사용하여 가비지 컬렉션을 수동으로 제어할 수 있습니다

import gc

# 가비지 컬렉션 강제 실행
gc.collect()

 

8. DataFrame 메모리 사용량 확인하기

Pandas의 memory_usage() 함수를 사용하여 DataFrame의 메모리 사용량을 확인할 수 있습니다

import pandas as pd

df = pd.DataFrame({'A': range(1000), 'B': [x * 2.5 for x in range(1000)]})
print(df.memory_usage(deep=True))

 

9. 데이터 타입 최적화하기

적절한 데이터 타입을 사용하여 메모리 사용량을 줄일 수 있습니다

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': np.random.rand(1000000)})
df['A'] = pd.to_numeric(df['A'], downcast='float')

 

10. 불필요한 열 제거하기

필요하지 않은 열을 제거하여 메모리 사용량을 줄일 수 있습니다

import pandas as pd

df = pd.read_csv('large_file.csv')
df = df[['important_column1', 'important_column2']]

 

11. 내부 할당

표준 할당 작업과 달리 내부 할당 작업은 새 DataFrame 개체를 생성하지 않고, 
원래 DataFrame자체를 수정하려고 합니다.

import pandas as pd

# 비효율적인 방법 (표준 할당)
df2 = df1.fillna(0)

# 효율적인 방법 (내부 할당)
df1.fillna(0, inplace =True)

 

이러한 기법들을 적절히 활용하면 Python 프로그램과 Pandas DataFrame의 메모리 사용을 크게 최적화할 수 있습니다.

효율적인 메모리 관리는 프로그램의 성능 향상과 안정성 개선에 큰 도움이 됩니다.

 

끝~