목차
Python의 비 게으른 평가 메커니즘
시나리오 1 : 변수에 명시 적으로 바인딩됩니다
시나리오 2 :리스트 리터럴은 반복자 생성에 직접 사용됩니다.
메모리 사용량과 수명주기의 핵심 차이
최적화 및 예방 조치
1. 발전기 표현식을 사용하여 메모리를 최적화하십시오
2. iter () 함수의 책임을 이해하십시오
3. 파이썬의 쓰레기 수집 메커니즘
요약
백엔드 개발 파이썬 튜토리얼 파이썬 목록 이해력 및 반복자 메모리 동작 심층 분석

파이썬 목록 이해력 및 반복자 메모리 동작 심층 분석

Sep 17, 2025 am 06:18 AM

파이썬 목록 이해력 및 반복자 메모리 동작 심층 분석

이 기사는 메모리 관리의 Python에서 목록 리터럴의 동작, 목록 이해력 및 반복자의 동작을 깊이 탐구합니다. 핵심 요점은 Python의 비 게으른 평가 특성이 변수에 할당되었는지 여부에 관계없이 메모리를 먼저 생성하고 소비 할 목록 이해력으로 이어진다는 것입니다. 주요 차이점은 결합되지 않은 변수의 목록리스트 리트가 반복기가 생성 된 후 더 빨리 수집되는 반면 변수에 바인딩 된 목록은 변수 수명주기 동안 탑승자로 유지된다는 것입니다.

Python의 비 게으른 평가 메커니즘

파이썬에서, 발현의 평가는 일반적으로 "게으른"이므로, 이는 표현이 실행되면 필요할 때까지 대기하지 않고 그 값이 즉시 계산된다는 것을 의미한다. 목록 이해력 [반복적 인 항목에 대한 표현식]의 경우,이 목록의 결과가 변수에 할당되는지 여부에 관계없이 먼저 전체 목록 개체와 모든 요소를 ​​메모리에 구축 할 것임을 의미합니다.

초기 메모리 풋 프린트에서 높은 수준의 유사성을 보여주는 두 가지 시나리오를 고려하십시오.

시나리오 1 : 변수에 명시 적으로 바인딩됩니다

목록 이해의 결과를 변수에 할당하면 변수가 재 할당, 삭제 또는 범위를 초과 할 때까지 목록 개체 및 포함 된 모든 요소가 메모리에 남아 있습니다.

 # 코드 1 : 가변 가져 오기 SYS에 명시 적으로 바인딩하는 목록

#이 코드 라인은 즉시 5000 정수의 전체 목록을 작성하여 my_list에 바인딩합니다.
my_list = [L의 경우 (5000)]
print (f "list 'my_list'객체 '메모리 풋 프린트 (요소 자체 제외) : {sys.getSizeof (my_list)} bytes")
# 참고 : sys.getSizeof () 목록 객체 자체의 메모리 풋 프린트를 반환합니다.
# 내부에 5000 개의 정수 객체의 총 메모리 사용을 제외합니다. 그러나 중요한 것은이 5000 개의 정수 물체가 실제로 만들어졌습니다.

# 기존 목록에서 반복자 생성 my_iter1 = iter (my_list)
print (f "iterator 'my_iter1'Object '메모리 풋 프린트 : {sys.getSizeof (my_iter1)} bytes (보통 작은)").

#이 시나리오에서 MY_LIST 및 참조 된 모든 정수 개체는 메모리를 계속 점유합니다.
# my_list가 쓰레기가 수집 될 때까지 또는 프로그램이 종료 될 때까지.

이 예에서 [l for l in range (5000)]는 5000 정수 목록을 만듭니다. 그런 다음 반복기를 만들더라도 원래 My_List와 모든 요소는 여전히 메모리에 존재하며 My_List 변수를 통해 액세스 할 수 있습니다.

시나리오 2 :리스트 리터럴은 반복자 생성에 직접 사용됩니다.

목록 이해의 결과가 변수에 명시 적으로 할당되지 않지만 (iter ())에 직접 전달되는 경우 Python 은이 목록을 먼저 생성합니다.

 # 코드 2 :리스트 리터럴은 직접 사용하여 반복자로 가져 오기 SYS를 생성합니다.

# 명시적인 변수 수신은 없지만 [I의 I For I in Range (5000)]는 즉시 5000 정수가있는 #의 전체 목록을 생성합니다.
# 그런 다음 iter () 함수는이 일시적으로 생성 된 목록을 매개 변수로 수신합니다.
my_iter2 = iter ([I for I in Range (5000)]))
print (f "iterator 'my_iter2'객체의 메모리 풋 프린트 : {sys.getSizeof (my_iter2)} 바이트 (일반적으로 더 작습니다)").

# 키 포인트 : ITER () 함수가 반환 된 후 반복기를 작성하는 데 사용되는 익명 목록 개체
# 다른 참조가 없으면 즉시 쓰레기 ​​수집 후보가됩니다.

이 시나리오에서 [I For I In in Range (5000)]는 5000 정수 목록도 생성합니다. iter () 함수는이 임시 목록을 수신하고 반복자를 반환합니다. ITER () 함수가 실행되고 다른 곳에서는이 일시적으로 작성된 목록 개체를 참조하면 Python의 쓰레기 수집 메커니즘은 목록과 그 요소의 메모리를 재활용 할 수 있습니다.

메모리 사용량과 수명주기의 핵심 차이

위의 분석을 통해 다음과 같은 결론을 도출 할 수 있습니다.

  1. 초기 메모리 풋 프린트 : 두 시나리오 모두에서 [L의 L에 대한 L (5000)] 또는 [I의 I의 I For I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for I for IN 따라서 "많은 양의 데이터가 생성되었는지 여부"의 관점에서 코드 1과 코드 2는 목록 작성 단계에서 유사합니다.
  2. 메모리 라이프 사이클 : 핵심 차이는 메모리의 목록 객체의 수명주기에 있습니다.
    • 시나리오 에서, 목록은 my_list 변수에 바인딩되며 My_List 변수의 수명주기가 끝날 때까지 메모리가 계속 소비됩니다.
    • 시나리오 2 에서 목록은 임시 익명의 객체입니다. ITER () 함수에 대한 인수로 생성되고 사용되며 ITER () 함수가 반환되고 다른 참조 가이 목록 객체를 가리 키지 않으면 즉시 쓰레기 ​​수집 후보가됩니다. 이것은 메모리 발자국이 수명이 짧다는 것을 의미합니다.

요컨대, func (expression) 및 변수 = 표현; Python의 비 게으른 평가 메커니즘에서 FUNC (가변) 모드는 표현을 완전히 계산하고 할당 된 메모리를 할당해야합니다. 유일한 차이점은 func ()가 반환 된 후, 메모리가 func ()에 의해 내부적으로 저장되지 않으면 메모리가 즉시 재활용 할 수 있다는 것입니다. 후자는 변수의 존재로 인해 메모리 수명주기를 확장합니다.

최적화 및 예방 조치

대규모 데이터 세트를 다루거나 메모리 효율을 추구하는 응용 프로그램의 경우 전체 목록을 직접 작성하는 것이 종종 최선의 선택이 아닙니다.

1. 발전기 표현식을 사용하여 메모리를 최적화하십시오

목표가 반복기를 만드는 것이고 전체 목록을 메모리에 동시에 유지할 필요가 없다면 목록 이해 대신 생성기 표현식을 사용해야합니다. 발전기 표현식은 사각형 브래킷 대신 괄호 ()를 사용하여 한 번에 모든 요소를 ​​구축하지는 않지만 주문시를 생성합니다.

 # 생성기 표현식 SYS를 사용하십시오

# my_generator_iter는 즉시 5000 정수를 모두 생성하지 않는 생성기 객체입니다.
print (f "생성기 객체의 메모리 사용 'my_generator_iter': {sys.getsizeof (my_generator_iter)} bytes (매우 작은)").

# 반복 할 때만 요소가 하나씩 생성되고 my_generator_iter에서 항목에 대한 메모리를 가져옵니다.
    # 프로세스 항목
    통과하다

발전기 표현식의 장점은 필요할 때만 다음 요소 만 계산하고 생성하여 피크 메모리 발자국을 크게 줄이는 것입니다.

2. iter () 함수의 책임을 이해하십시오

iter () 함수의 함수는 객체의 반복자를 얻는 것입니다. 데이터 자체를 생성 할 책임이 아니라 기존 반복 가능한 객체에서 반복자를 얻는 것이 좋습니다. 따라서 ITER ()에 큰 목록을 통과하면이 큰 목록의 생성 및 메모리 사용이 이미 발생했으며 iter ()는이 기준으로 트래버스 메커니즘을 제공합니다.

3. 파이썬의 쓰레기 수집 메커니즘

Python은 기본 쓰레기 수집 메커니즘으로 기준 계수를 사용합니다. 객체의 기준 횟수가 0이되면 쓰레기 수집 후보가됩니다. 원형 참조의 경우 Python은 처리를 위해 Mark-and-Sweep 알고리즘을 사용합니다. 이러한 메커니즘을 이해하면 메모리를 더 잘 관리하는 데 도움이됩니다.

요약

Python은 결과가 변수에 할당되는지 여부에 관계없이 포괄적 인 목록을 작성할 때 먼저 완전한 평가를 수행하고 메모리에서 전체 목록 개체를 작성합니다. 따라서 ITER ([5000)의 I에 대한 I) 및 My_List = [L의 L에 대해 L (5000)); ITER (My_List)은 초기 메모리 할당에서 유사합니다. 둘 다 5000 정수 목록을 작성하므로. 주요 차이점은이 목록 개체의 수명주기입니다. 변수에 바인딩되지 않은 목록 문자는 책임을 완료 한 후 (ITER ()에서 사용하는 경우)가 더 빨리 쓰레기 수집 후보가됩니다 (변수 목록은 변수의 수명주기가 끝날 때까지 계속 메모리를 소비합니다.

특히 많은 양의 데이터를 처리 할 때 메모리를 효과적으로 관리하려면 ITERABLE의 항목에 대한 생성기 표현식을 사용하여 모든 데이터를 메모리에 한 번에로드하지 않도록 반복기를 만들어내는 것이 좋습니다.

위 내용은 파이썬 목록 이해력 및 반복자 메모리 동작 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Stock Market GPT

Stock Market GPT

더 현명한 결정을 위한 AI 기반 투자 연구

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제

Python에서 요구 사항에서 패키지를 설치하는 방법 Python에서 요구 사항에서 패키지를 설치하는 방법 Sep 18, 2025 am 04:24 AM

종속성 패키지를 설치하려면 pipinstall-rrequirements.txt를 실행하십시오. 충돌을 피하고, 파일 경로가 올바른지 확인하고 PIP가 업데이트되었는지 확인하고 필요한 경우 설치 동작을 조정하기 위해-no-deps 또는 --user와 같은 옵션을 사용하는 것이 좋습니다.

PEFT LORA 어댑터 및 기본 모델의 효율적인 병합 전략 PEFT LORA 어댑터 및 기본 모델의 효율적인 병합 전략 Sep 19, 2025 pm 05:12 PM

이 튜토리얼은 PEFT LORA 어댑터를 기본 모델과 효율적으로 병합하여 완전히 독립적 인 모델을 생성하는 방법을 자세히 설명합니다. 이 기사는 변압기를 직접 사용하는 것이 잘못되었음을 지적합니다. Aumodel은 어댑터를로드하고 가중치를 수동으로 병합하고 PEFT 라이브러리에서 MERGE_AND_UNLOAD 방법을 사용하는 올바른 프로세스를 제공합니다. 또한 튜토리얼은 워드 세그먼트를 다루는 것의 중요성을 강조하고 PEFT 버전 호환성 문제 및 솔루션에 대해 설명합니다.

Pytest로 Python 코드를 테스트하는 방법 Pytest로 Python 코드를 테스트하는 방법 Sep 20, 2025 am 12:35 AM

Python은 Python의 간단하고 강력한 테스트 도구입니다. 설치 후 테스트 파일은 이름 지정 규칙에 따라 자동으로 발견됩니다. 어설 션 테스트를 위해 test_로 시작하여 기능을 작성하고 @pytest.fixture를 사용하여 재사용 가능한 테스트 데이터를 생성하고 pytest.raises를 통해 예외를 확인하고 지정된 테스트 실행 및 여러 명령 줄 옵션을 지원하며 테스트 효율성을 향상시킵니다.

파이썬 및 고정밀 계산 체계의 부동 소수점 번호 정확도 문제 파이썬 및 고정밀 계산 체계의 부동 소수점 번호 정확도 문제 Sep 19, 2025 pm 05:57 PM

이 기사는 Python과 Numpy의 부동 소수점 수의 부동 소수 계산 정확도의 일반적인 문제를 탐색하는 것을 목표로하며, 근본 원인은 표준 64 비트 플로팅 포인트 수의 표현 제한에 있다고 설명합니다. 더 높은 정확도가 필요한 컴퓨팅 시나리오의 경우,이 기사는 독자가 복잡한 정확도 요구를 해결하기위한 올바른 도구를 선택할 수 있도록 MPMATH, Sympy 및 GMPY와 같은 고정밀 수학 라이브러리의 사용 방법, 기능 및 해당 시나리오를 소개하고 비교합니다.

파이썬에서 명령 줄 인수를 처리하는 방법 파이썬에서 명령 줄 인수를 처리하는 방법 Sep 21, 2025 am 03:49 AM

theargparsemoduleisecomedendedway handlecommand-lineargumentsinpython, robustparsing, typevalidation, helpmessages, anderrorhandling; audys.argvforsimplecaseSrequiringMinimalSetup을 제공합니다.

Python에서 PDF 파일을 사용하는 방법 Python에서 PDF 파일을 사용하는 방법 Sep 20, 2025 am 04:44 AM

PYPDF2, PDFPLAMBER 및 FPDF는 Python이 PDF를 처리하기위한 핵심 라이브러리입니다. PYPDF2를 사용하여 PDFREADER를 통해 페이지를 읽고 extract_text ()를 호출하려면 텍스트 추출, 병합, 분할 및 암호화를 수행하십시오. PDFPlumber는 레이아웃 텍스트 추출 및 테이블 인식을 유지하는 데 더 적합하며 TABLE 데이터를 정확하게 캡처하기 위해 Extract_Tables ()를 지원합니다. FPDF (권장 FPDF2)는 PDF를 생성하는 데 사용되며 문서는 add_page (), set_font () 및 cell ()을 통해 구축 및 출력됩니다. pdfs를 병합 할 때 pdfwriter의 append () 메소드는 여러 파일을 통합 할 수 있습니다.

파이썬은 현재 시간 예제를 얻습니다 파이썬은 현재 시간 예제를 얻습니다 Sep 15, 2025 am 02:32 AM

현재 시간을 얻는 것은 DateTime 모듈을 통해 Python에서 구현할 수 있습니다. 1. DateTime.now ()를 사용하여 로컬 현재 시간을 얻으십시오. utcnow () 및 일일 작업은 Datetime.now ()를 형식의 문자열과 결합하여 요구를 충족시킬 수 있습니다.

Pandas : IP, Mac 및 Port Association 튜토리얼을 사용한 멀티 파일 데이터의 효율적인 통합 Pandas : IP, Mac 및 Port Association 튜토리얼을 사용한 멀티 파일 데이터의 효율적인 통합 Sep 21, 2025 pm 03:00 PM

이 튜토리얼은 Python의 Pandas 라이브러리를 사용하여 여러 텍스트 파일에서 특정 데이터를 효율적으로 추출, 연관 및 통합하는 방법을 자세히 보여줍니다. 파일 데이터를 데이터 프레임에로드하고 Merge 작동을 사용하여 IP 주소 및 MAC 주소를 기반으로 내부 연결을 수행하면 IP, MAC 주소의 연결 정보 및 다른 소스의 파일의 해당 포트를 최종적으로 구현합니다.

See all articles