> 백엔드 개발 > 파이썬 튜토리얼 > Python 메모리 최적화 익히기: 데이터 과학 및 기계 학습 기술

Python 메모리 최적화 익히기: 데이터 과학 및 기계 학습 기술

Barbara Streisand
풀어 주다: 2025-01-20 06:14:10
원래의
388명이 탐색했습니다.

Mastering Python Memory Optimization: Techniques for Data Science and Machine Learning

저는 다작 작가로서 제 아마존 도서 컬렉션을 살펴보실 수 있도록 여러분을 초대합니다. 업데이트를 받으려면 Medium에서 저를 팔로우하고 여러분의 지지를 보여주세요! 여러분의 많은 격려 부탁드립니다!

데이터 과학 및 기계 학습 분야에서 Python의 중요성이 커지고 있기 때문에 대규모 프로젝트를 위한 효율적인 메모리 관리가 필요합니다. 데이터 세트의 크기가 커지고 계산 요구 사항이 증가함에 따라 최적화된 메모리 사용이 중요해졌습니다. 메모리 집약적인 Python 애플리케이션에 대한 나의 경험을 통해 몇 가지 효과적인 최적화 전략이 탄생했으며, 이를 여기에서 공유하겠습니다.

수치 계산의 초석 라이브러리인 NumPy부터 시작하겠습니다. NumPy 배열은 특히 광범위한 데이터 세트의 경우 Python 목록에 비해 상당한 메모리 이점을 제공합니다. 연속적인 메모리 할당과 정적 타이핑으로 오버헤드가 최소화됩니다.

이 비교를 고려해보세요:

<code class="language-python">import numpy as np
import sys

# Creating a list and a NumPy array with 1 million integers
py_list = list(range(1000000))
np_array = np.arange(1000000)

# Comparing memory usage
print(f"Python list size: {sys.getsizeof(py_list) / 1e6:.2f} MB")
print(f"NumPy array size: {np_array.nbytes / 1e6:.2f} MB")</code>
로그인 후 복사
로그인 후 복사

NumPy 배열의 메모리 공간이 더 작다는 것은 분명합니다. 이러한 차이는 데이터 세트가 클수록 더욱 두드러집니다.

NumPy는 메모리 효율적인 작업도 제공합니다. 각 작업마다 새 배열을 생성하는 대신 배열을 내부에서 수정하는 경우가 많습니다.

<code class="language-python"># In-place operations
np_array += 1  # Modifies the original array directly</code>
로그인 후 복사
로그인 후 복사

Pandas를 살펴보면 범주형 데이터 유형이 메모리 최적화의 핵심입니다. 고유 값이 제한된 문자열 열의 경우 범주형 유형으로 변환하면 메모리 소비가 크게 줄어듭니다.

<code class="language-python">import pandas as pd

# DataFrame with repeated string values
df = pd.DataFrame({'category': ['A', 'B', 'C'] * 1000000})

# Memory usage check
print(f"Original memory usage: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

# Conversion to categorical
df['category'] = pd.Categorical(df['category'])

# Post-conversion memory usage
print(f"Memory usage after conversion: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")</code>
로그인 후 복사
로그인 후 복사

특히 반복 문자열이 포함된 대규모 데이터세트의 경우 메모리 절약 효과가 상당할 수 있습니다.

희소 데이터세트의 경우 Pandas는 null이 아닌 값만 저장하는 희소 데이터 구조를 제공하므로 null 또는 0 값이 많은 데이터세트의 경우 상당한 메모리 절약 효과를 얻을 수 있습니다.

<code class="language-python"># Creating a sparse series
sparse_series = pd.Series([0, 0, 1, 0, 2, 0, 0, 3], dtype="Sparse[int]")

print(f"Memory usage: {sparse_series.memory_usage(deep=True) / 1e3:.2f} KB")</code>
로그인 후 복사
로그인 후 복사

데이터 세트가 사용 가능한 RAM을 초과하면 메모리 매핑된 파일이 변형됩니다. 전체 파일을 로드하지 않고도 마치 메모리에 있는 것처럼 대용량 파일을 작업할 수 있습니다.

<code class="language-python">import mmap
import os

# Creating a large file
with open('large_file.bin', 'wb') as f:
    f.write(b'0' * 1000000000)  # 1 GB file

# Memory-mapping the file
with open('large_file.bin', 'r+b') as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)

# Reading from the memory-mapped file
print(mmapped_file[1000000:1000010])

# Cleaning up
mmapped_file.close()
os.remove('large_file.bin')</code>
로그인 후 복사
로그인 후 복사

이 기능은 대용량 파일을 메모리에 완전히 로드하지 않고 무작위로 액세스할 때 특히 유용합니다.

생성기 표현식과 itertools은 메모리 효율적인 데이터 처리에 강력합니다. 모든 것을 동시에 메모리에 로드하지 않고도 대규모 데이터 세트를 처리할 수 있습니다.

<code class="language-python">import itertools

# Generator expression
sum_squares = sum(x*x for x in range(1000000))

# Using itertools for memory-efficient operations
evens = itertools.islice(itertools.count(0, 2), 1000000)
sum_evens = sum(evens)

print(f"Sum of squares: {sum_squares}")
print(f"Sum of even numbers: {sum_evens}")</code>
로그인 후 복사
로그인 후 복사

이러한 기술은 대규모 데이터세트를 처리하는 동안 메모리 오버헤드를 최소화합니다.

성능이 중요한 코드 섹션의 경우 Cython은 상당한 최적화 가능성을 제공합니다. Python 코드를 C로 컴파일하면 속도가 크게 향상되고 메모리가 줄어들 수 있습니다.

<code class="language-cython">def sum_squares_cython(int n):
    cdef int i
    cdef long long result = 0
    for i in range(n):
        result += i * i
    return result

# Usage
result = sum_squares_cython(1000000)
print(f"Sum of squares: {result}")</code>
로그인 후 복사

이 Cython 함수는 특히 큰 n 값의 경우 순수 Python 함수보다 성능이 뛰어납니다.

Just-In-Time 컴파일러인 PyPy는 자동 메모리 최적화를 제공합니다. 이는 장기 실행 프로그램에 특히 유용하며 종종 메모리 사용량을 크게 줄여줍니다.

<code class="language-python">import numpy as np
import sys

# Creating a list and a NumPy array with 1 million integers
py_list = list(range(1000000))
np_array = np.arange(1000000)

# Comparing memory usage
print(f"Python list size: {sys.getsizeof(py_list) / 1e6:.2f} MB")
print(f"NumPy array size: {np_array.nbytes / 1e6:.2f} MB")</code>
로그인 후 복사
로그인 후 복사

PyPy는 표준 CPython에 비해 메모리 효율성과 속도가 향상될 수 있습니다.

최적화 기회를 식별하려면 메모리 프로파일링이 필수적입니다. memory_profiler 라이브러리는 귀중한 도구입니다.

<code class="language-python"># In-place operations
np_array += 1  # Modifies the original array directly</code>
로그인 후 복사
로그인 후 복사

mprof run script.pymprof plot을 사용하여 메모리 사용량을 시각화하세요.

메모리 누수를 해결하는 것이 중요합니다. tracemalloc 모듈(Python 3.4)은 메모리 할당 소스를 식별하는 데 도움이 됩니다.

<code class="language-python">import pandas as pd

# DataFrame with repeated string values
df = pd.DataFrame({'category': ['A', 'B', 'C'] * 1000000})

# Memory usage check
print(f"Original memory usage: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")

# Conversion to categorical
df['category'] = pd.Categorical(df['category'])

# Post-conversion memory usage
print(f"Memory usage after conversion: {df.memory_usage(deep=True).sum() / 1e6:.2f} MB")</code>
로그인 후 복사
로그인 후 복사

이는 메모리 집약적인 코드 섹션을 정확히 찾아냅니다.

메모리 집약적인 애플리케이션의 경우 맞춤형 메모리 관리가 필요할 수 있습니다. 여기에는 객체 재사용 또는 사용자 정의 캐싱을 위한 객체 풀이 포함될 수 있습니다.

<code class="language-python"># Creating a sparse series
sparse_series = pd.Series([0, 0, 1, 0, 2, 0, 0, 3], dtype="Sparse[int]")

print(f"Memory usage: {sparse_series.memory_usage(deep=True) / 1e3:.2f} KB")</code>
로그인 후 복사
로그인 후 복사

이렇게 하면 객체 생성/파괴 오버헤드가 최소화됩니다.

매우 큰 데이터세트의 경우 Dask와 같은 코어 외부 계산 라이브러리를 고려하세요.

<code class="language-python">import mmap
import os

# Creating a large file
with open('large_file.bin', 'wb') as f:
    f.write(b'0' * 1000000000)  # 1 GB file

# Memory-mapping the file
with open('large_file.bin', 'r+b') as f:
    mmapped_file = mmap.mmap(f.fileno(), 0)

# Reading from the memory-mapped file
print(mmapped_file[1000000:1000010])

# Cleaning up
mmapped_file.close()
os.remove('large_file.bin')</code>
로그인 후 복사
로그인 후 복사

Dask는 계산을 더 작은 단위로 나누어 사용 가능한 RAM보다 큰 데이터 세트를 처리합니다.

알고리즘 최적화도 중요합니다. 효율적인 알고리즘을 선택하면 메모리 사용량을 크게 줄일 수 있습니다.

<code class="language-python">import itertools

# Generator expression
sum_squares = sum(x*x for x in range(1000000))

# Using itertools for memory-efficient operations
evens = itertools.islice(itertools.count(0, 2), 1000000)
sum_evens = sum(evens)

print(f"Sum of squares: {sum_squares}")
print(f"Sum of even numbers: {sum_evens}")</code>
로그인 후 복사
로그인 후 복사

이 최적화된 피보나치 함수는 순진한 재귀 구현과 달리 상수 메모리를 사용합니다.

요약하자면 효과적인 Python 메모리 최적화는 효율적인 데이터 구조, 특수 라이브러리, 메모리 효율적인 코딩 및 적절한 알고리즘을 결합합니다. 이러한 기술은 메모리 공간을 줄여 더 큰 데이터 세트와 더 복잡한 계산을 처리할 수 있게 해줍니다. 병목 현상을 식별하고 가장 큰 영향을 미칠 수 있는 최적화 노력에 집중하려면 코드를 프로파일링하는 것을 잊지 마세요.


101권

작가

Aarav Joshi가 공동 설립한 AI 기반 출판사인 101 Books는 AI를 활용하여 출판 비용을 최소화하고 양질의 지식에 접근할 수 있도록 합니다(일부 도서는 $4!).

Amazon에서 Golang Clean Code 도서를 찾아보세요.

업데이트 및 더 많은 타이틀을 보려면 Amazon에서 Aarav Joshi를 검색하세요. [링크]를 통해 특별 할인을 받으실 수 있습니다.

우리의 창작물

저희 창작물을 살펴보세요.

인베스터 센트럴 | 투자자 중앙 스페인어 | 중앙 독일 투자자 | 스마트리빙 | 시대와 메아리 | 수수께끼의 미스터리 | 힌두트바 | 엘리트 개발자 | JS 학교


Medium에 있습니다

테크 코알라 인사이트 | Epochs & Echoes World | 투자자중앙매체 | 수수께끼 미스터리 매체 | 과학과 신기원 매체 | 현대 힌두트바

위 내용은 Python 메모리 최적화 익히기: 데이터 과학 및 기계 학습 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿