> 백엔드 개발 > 파이썬 튜토리얼 > 효율적인 메모리 관리를 위한 강력한 Python 기술

효율적인 메모리 관리를 위한 강력한 Python 기술

Linda Hamilton
풀어 주다: 2025-01-06 18:19:43
원래의
160명이 탐색했습니다.

owerful Python Techniques for Efficient Memory Management

베스트셀러 작가로서 Amazon에서 제 책을 탐색해 보시기 바랍니다. Medium에서 저를 팔로우하고 지지를 표시하는 것을 잊지 마세요. 감사합니다! 당신의 지원은 세상을 의미합니다!

Python의 메모리 관리는 효율적이고 확장 가능한 애플리케이션을 개발하는 데 중요한 측면입니다. 개발자로서 저는 이러한 기술을 익히면 메모리 집약적인 작업의 성능이 크게 향상될 수 있다는 사실을 발견했습니다. 효율적인 메모리 관리를 위한 6가지 강력한 Python 기술을 살펴보겠습니다.

객체 풀링은 할당 및 할당 취소 오버헤드를 최소화하기 위해 제가 자주 사용하는 전략입니다. 새로운 객체를 생성하는 대신 객체를 재사용함으로써 메모리 변동을 줄이고 성능을 향상시킬 수 있습니다. 다음은 개체 풀의 간단한 구현입니다.

class ObjectPool:
    def __init__(self, create_func):
        self.create_func = create_func
        self.pool = []

    def acquire(self):
        if self.pool:
            return self.pool.pop()
        return self.create_func()

    def release(self, obj):
        self.pool.append(obj)

def create_expensive_object():
    return [0] * 1000000

pool = ObjectPool(create_expensive_object)

obj1 = pool.acquire()
# Use obj1
pool.release(obj1)

obj2 = pool.acquire()  # This will reuse the same object
로그인 후 복사
로그인 후 복사

이 기술은 만드는 데 비용이 많이 들거나 자주 사용하고 폐기하는 물건에 특히 유용합니다.

약한 참조는 Python의 메모리 관리 무기고에 있는 또 다른 강력한 도구입니다. 이를 통해 참조 횟수를 늘리지 않고도 개체에 대한 링크를 만들 수 있으며, 이는 캐시를 구현하거나 순환 참조를 피하는 데 유용할 수 있습니다. Weakref 모듈은 필요한 기능을 제공합니다:

import weakref

class ExpensiveObject:
    def __init__(self, value):
        self.value = value

def on_delete(ref):
    print("Object deleted")

obj = ExpensiveObject(42)
weak_ref = weakref.ref(obj, on_delete)

print(weak_ref().value)  # Output: 42
del obj
print(weak_ref())  # Output: None (and "Object deleted" is printed)
로그인 후 복사
로그인 후 복사

클래스에서 슬롯을 사용하면 특히 많은 인스턴스를 처리할 때 메모리 소비를 크게 줄일 수 있습니다. 슬롯을 정의함으로써 Python에 동적 사전 대신 고정 크기 배열을 속성에 사용하도록 지시합니다.

class RegularClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class SlottedClass:
    __slots__ = ['x', 'y']
    def __init__(self, x, y):
        self.x = x
        self.y = y

import sys

regular = RegularClass(1, 2)
slotted = SlottedClass(1, 2)

print(sys.getsizeof(regular))  # Output: 48 (on Python 3.8, 64-bit)
print(sys.getsizeof(slotted))  # Output: 24 (on Python 3.8, 64-bit)
로그인 후 복사
로그인 후 복사

메모리 매핑 파일은 대규모 데이터세트를 효율적으로 처리하기 위한 강력한 기술입니다. mmap 모듈을 사용하면 파일을 메모리에 직접 매핑하여 전체 파일을 로드하지 않고도 빠른 무작위 액세스를 제공할 수 있습니다.

import mmap

with open('large_file.bin', 'rb') as f:
    mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    # Read 100 bytes starting at offset 1000
    data = mm[1000:1100]
    mm.close()
로그인 후 복사
로그인 후 복사

이 접근 방식은 너무 커서 메모리에 들어갈 수 없는 파일을 작업할 때 특히 유용합니다.

메모리 사용량을 최적화하려면 메모리 사용량이 많은 개체를 식별하는 것이 중요합니다. sys.getsizeof() 함수는 시작점을 제공하지만 중첩된 개체를 고려하지 않습니다. 보다 포괄적인 메모리 프로파일링을 위해 나는 종종 memory_profiler와 같은 타사 도구를 사용합니다.

from memory_profiler import profile

@profile
def memory_hungry_function():
    list_of_lists = [[i] * 1000 for i in range(1000)]
    return sum(sum(sublist) for sublist in list_of_lists)

memory_hungry_function()
로그인 후 복사
로그인 후 복사

이렇게 하면 라인별 메모리 사용량 보고서가 출력되어 코드에서 메모리를 가장 많이 사용하는 부분을 식별하는 데 도움이 됩니다.

메모리 집약적인 애플리케이션에서는 대규모 컬렉션을 효율적으로 관리하는 것이 중요합니다. 대규모 데이터세트를 처리할 때 데이터를 점진적으로 처리하기 위해 목록 대신 생성기를 사용하는 경우가 많습니다.

def process_large_dataset(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield process_line(line)

for result in process_large_dataset('large_file.txt'):
    print(result)
로그인 후 복사
로그인 후 복사

이 접근 방식을 사용하면 전체 데이터 세트를 한 번에 메모리에 로드하지 않고도 데이터를 처리할 수 있습니다.

특정 사용 사례에 맞게 사용자 정의 메모리 관리 체계를 구현할 수 있습니다. 예를 들어, 디스크가 너무 커지면 자동으로 디스크에 쓰는 사용자 정의 목록형 개체를 만들 수 있습니다.

class ObjectPool:
    def __init__(self, create_func):
        self.create_func = create_func
        self.pool = []

    def acquire(self):
        if self.pool:
            return self.pool.pop()
        return self.create_func()

    def release(self, obj):
        self.pool.append(obj)

def create_expensive_object():
    return [0] * 1000000

pool = ObjectPool(create_expensive_object)

obj1 = pool.acquire()
# Use obj1
pool.release(obj1)

obj2 = pool.acquire()  # This will reuse the same object
로그인 후 복사
로그인 후 복사

이 클래스를 사용하면 데이터를 자동으로 디스크에 오프로드하여 사용 가능한 메모리보다 큰 목록으로 작업할 수 있습니다.

과학 컴퓨팅에서 흔히 사용되는 NumPy 배열로 작업할 때 대규모 데이터 세트를 효율적으로 처리하기 위해 메모리 매핑 배열을 사용할 수 있습니다.

import weakref

class ExpensiveObject:
    def __init__(self, value):
        self.value = value

def on_delete(ref):
    print("Object deleted")

obj = ExpensiveObject(42)
weak_ref = weakref.ref(obj, on_delete)

print(weak_ref().value)  # Output: 42
del obj
print(weak_ref())  # Output: None (and "Object deleted" is printed)
로그인 후 복사
로그인 후 복사

이 접근 방식을 사용하면 사용 가능한 RAM보다 큰 어레이로 작업할 수 있으며 변경 사항이 자동으로 디스크에 동기화됩니다.

장기 실행 서버 애플리케이션의 경우 사용자 정의 개체 캐시를 구현하면 성능이 크게 향상되고 메모리 사용량이 줄어들 수 있습니다.

class RegularClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

class SlottedClass:
    __slots__ = ['x', 'y']
    def __init__(self, x, y):
        self.x = x
        self.y = y

import sys

regular = RegularClass(1, 2)
slotted = SlottedClass(1, 2)

print(sys.getsizeof(regular))  # Output: 48 (on Python 3.8, 64-bit)
print(sys.getsizeof(slotted))  # Output: 24 (on Python 3.8, 64-bit)
로그인 후 복사
로그인 후 복사

이 캐시는 지정된 시간이 지나면 자동으로 항목을 만료시켜 장기 실행 애플리케이션에서 메모리 누수를 방지합니다.

대규모 텍스트 처리 작업을 처리할 때 반복자와 생성기를 사용하면 메모리 사용량을 크게 줄일 수 있습니다.

import mmap

with open('large_file.bin', 'rb') as f:
    mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    # Read 100 bytes starting at offset 1000
    data = mm[1000:1100]
    mm.close()
로그인 후 복사
로그인 후 복사

이 접근 방식은 파일을 한 줄씩 처리하므로 전체 파일을 메모리에 로드할 필요가 없습니다.

많은 임시 객체를 생성하는 애플리케이션의 경우 컨텍스트 관리자를 사용하면 적절한 정리를 보장하고 메모리 누수를 방지할 수 있습니다.

from memory_profiler import profile

@profile
def memory_hungry_function():
    list_of_lists = [[i] * 1000 for i in range(1000)]
    return sum(sum(sublist) for sublist in list_of_lists)

memory_hungry_function()
로그인 후 복사
로그인 후 복사

이 패턴은 예외가 발생하더라도 리소스가 올바르게 해제되도록 보장합니다.

Pandas에서 대규모 데이터 세트로 작업할 때 청크를 사용하여 관리 가능한 조각으로 데이터를 처리할 수 있습니다.

def process_large_dataset(filename):
    with open(filename, 'r') as f:
        for line in f:
            yield process_line(line)

for result in process_large_dataset('large_file.txt'):
    print(result)
로그인 후 복사
로그인 후 복사

이 접근 방식을 사용하면 사용 가능한 메모리보다 큰 데이터 세트를 청크로 처리하여 작업할 수 있습니다.

결론적으로 Python의 효율적인 메모리 관리에는 내장된 언어 기능, 타사 도구 및 사용자 지정 구현의 조합이 포함됩니다. 이러한 기술을 신중하게 적용함으로써 대규모 데이터 세트나 장기 실행 프로세스를 처리할 때에도 메모리 효율성과 성능이 모두 뛰어난 Python 애플리케이션을 만들 수 있습니다. 핵심은 애플리케이션의 메모리 특성을 이해하고 각 특정 사용 사례에 적합한 기술을 선택하는 것입니다.


101권

101 Books는 작가 Aarav Joshi가 공동 창립한 AI 기반 출판사입니다. 고급 AI 기술을 활용하여 출판 비용을 믿을 수 없을 정도로 낮게 유지합니다. 일부 도서의 가격은 $4만큼 저렴하여 모든 사람이 양질의 지식에 접근할 수 있습니다.

아마존에서 구할 수 있는 Golang Clean Code 책을 확인해 보세요.

업데이트와 흥미로운 소식을 계속 지켜봐 주시기 바랍니다. 책을 쇼핑할 때 Aarav Joshi를 검색해 더 많은 책을 찾아보세요. 제공된 링크를 이용하여 특별할인을 즐겨보세요!

우리의 창조물

저희 창작물을 꼭 확인해 보세요.

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


우리는 중간에 있습니다

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

위 내용은 효율적인 메모리 관리를 위한 강력한 Python 기술의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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