목차
Python이 메모리를 관리하는 방법" >Python이 메모리를 관리하는 방법
Python의 참조 순환" >Python의 참조 순환
Python 가비지 수집기(gc)" >Python 가비지 수집기(gc)
如何使用 gc 模块" >如何使用 gc 模块
使用 gc 调试垃圾收集" >使用 gc 调试垃圾收集
避免 Python 内存管理中的陷阱" >避免 Python 内存管理中的陷阱
注意对象范围" >注意对象范围
使用 weakref避免引用循环" >使用 weakref避免引用循环
수동으로 참조 순환 끊기" >수동으로 참조 순환 끊기
백엔드 개발 파이썬 튜토리얼 Python 메모리 관리가 어떻게 작동하는지 이해하고 있나요?

Python 메모리 관리가 어떻게 작동하는지 이해하고 있나요?

Apr 12, 2023 pm 04:25 PM
python 메모리 관리

Python은 개발자에게 많은 편의를 제공하며, 가장 큰 장점 중 하나는 사실상 걱정 없는 메모리 관리입니다. 개발자는 더 이상 Python의 개체 및 데이터 구조에 대한 메모리를 수동으로 할당, 추적 및 해제할 필요가 없습니다. 런타임이 이 모든 작업을 수행하므로 시스템 수준의 세부 사항을 다루기보다는 실제 문제를 해결하는 데 집중할 수 있습니다.

Python 메모리 관리가 어떻게 작동하는지 이해하고 있나요?

경험이 부족한 Python 사용자라도 Python의 가비지 수집 및 메모리 관리 작동 방식을 이해하는 것이 좋습니다. 이러한 메커니즘을 이해하면 보다 복잡한 프로젝트에서 발생할 수 있는 성능 문제를 방지하는 데 도움이 됩니다. Python에 내장된 도구를 사용하여 프로그램의 메모리 관리 동작을 모니터링할 수도 있습니다.

Python이 메모리를 관리하는 방법

모든 Python 객체에는 참조 카운트라고도 하는 참조 카운트가 있습니다. refcount는 주어진 객체에 대한 참조를 보유하는 다른 객체의 총 개수입니다. 개체에 대한 참조를 추가하거나 제거하면 숫자가 올라가거나 내려갑니다. 개체의 참조 횟수가 0에 도달하면 개체 할당이 취소되고 해당 메모리가 해제됩니다.

레퍼런스란 무엇인가요? 이름으로 또는 다른 개체의 접근자를 통해 개체의 모든 콘텐츠에 액세스할 수 있습니다.

다음은 간단한 예입니다.

x = "Hello there"
로그인 후 복사

이 명령을 Python에 실행하면 내부적으로 두 가지 일이 발생합니다.

  1. 문자열 "Hello there"가 Python 개체로 생성되어 메모리에 저장됩니다.
  2. x라는 이름은 로컬 네임스페이스에 생성되고 객체를 가리키며 참조 횟수가 1:1로 증가합니다.

y = x라고 하면 참조 횟수는 다시 2로 증가합니다.

xandy가 범위를 벗어나거나 네임스페이스에서 제거될 때마다 문자열의 참조 횟수는 각 이름에 대해 1씩 감소합니다. x와 y가 모두 범위를 벗어나거나 삭제되면 문자열의 참조 카운트는 0이 되어 삭제됩니다.

이제 아래와 같이 문자열이 포함된 목록을 생성한다고 가정해 보겠습니다.

x = ["Hello there", 2, False]
로그인 후 복사

문자열은 목록 자체가 삭제되거나 문자열을 포함하는 요소가 목록에서 제거될 때까지 메모리에 남아 있습니다. 이러한 작업 중 하나를 수행하면 문자열에 대한 참조를 보유하는 유일한 항목이 사라지게 됩니다.

이제 다음 예를 생각해 보세요.

x = "Hello there" y = [x]
로그인 후 복사

에서 첫 번째 요소 y를 제거하거나 목록 y를 완전히 제거해도 문자열은 여전히 ​​메모리에 있습니다. 이는 x라는 이름에 이에 대한 참조가 포함되어 있기 때문입니다.

Python의 참조 순환

대부분의 경우 참조 카운팅은 잘 작동합니다. 그러나 때로는 두 개체가 서로에 대한 참조를 보유하는 상황에 직면할 때도 있습니다. 이를 참조 기간이라고 합니다. 이 경우 객체의 참조 횟수는 결코 0에 도달하지 않으며 메모리에서 삭제되지도 않습니다.

이것은 인위적인 예입니다:

x = SomeClass()
y = SomeOtherClass()
x.item = y
y.item = x
로그인 후 복사

x와 y는 서로에 대한 참조를 보유하므로 둘 중 하나를 참조하는 다른 항목이 없더라도 시스템에서 삭제되지 않습니다.

실제로 Python 자체 런타임에서 객체에 대한 참조 순환을 생성하는 것은 매우 일반적입니다. 예를 들어 예외 자체에 대한 참조가 포함된 추적 객체의 예외가 있습니다.

이전 버전의 Python에서는 이것이 문제였습니다. 참조 순환이 있는 객체는 시간이 지남에 따라 누적될 수 있으며 이는 장기 실행 애플리케이션에 큰 문제입니다. 그러나 Python은 이후 참조 순환을 관리하기 위해 순환 감지 및 가비지 수집 시스템을 도입했습니다.

Python 가비지 수집기(gc)

Python의 가비지 수집기는 참조 순환을 사용하여 객체를 감지합니다. 이는 "컨테이너"인 개체(예: 목록, 사전, 사용자 정의 클래스 인스턴스)를 추적하고 그 중 다른 곳에서는 액세스할 수 없는 개체를 결정함으로써 이를 수행합니다.

이러한 객체가 선택되면 가비지 수집기는 참조 횟수가 안전하게 0으로 떨어질 수 있도록 보장하여 객체를 제거합니다.

대부분의 Python 객체에는 참조 주기가 없으므로 가비지 수집기가 연중무휴로 실행될 필요가 없습니다. 대신 가비지 수집기는 몇 가지 경험적 방법을 사용하여 실행 빈도를 줄이고 매번 최대한 효율적으로 실행합니다.

Python 인터프리터가 시작되면 할당되었지만 해제되지 않은 개체 수를 추적합니다. 대다수의 Python 객체는 수명이 짧기 때문에 빠르게 나타나고 사라집니다. 그러나 시간이 지남에 따라 수명이 더 긴 개체가 더 많이 나타날 것입니다. 특정 개수 이상의 개체가 누적되면 가비지 수집기가 실행됩니다.

가비지 컬렉터가 실행될 때마다 컬렉션에서 살아남은 모든 개체를 수집하여 세대라는 그룹에 배치합니다. 이러한 "1세대" 개체는 참조 주기에서 덜 자주 검색됩니다. 가비지 수집기 후에도 남아 있는 모든 1세대 개체는 결국 2세대로 마이그레이션되어 검색 빈도가 줄어듭니다.

同样,垃圾收集器不会跟踪所有内容。例如,像用户创建的类这样的复杂对象总是被跟踪。但是不会跟踪仅包含简单对象(如整数和字符串)的字典,因为该特定字典中的任何对象都不会包含对其他对象的引用。不能保存对其他元素(如整数和字符串)的引用的简单对象永远不会被跟踪。

如何使用 gc 模块

通常,垃圾收集器不需要调整即可运行良好。Python 的开发团队选择了反映最常见现实世界场景的默认值。但是如果你确实需要调整垃圾收集的工作方式,你可以使用Python 的 gc 模块。该gc模块为垃圾收集器的行为提供编程接口,并提供对正在跟踪的对象的可见性。

gc当你确定不需要垃圾收集器时,你可以做的一件有用的事情是关闭它。例如,如果你有一个堆放大量对象的短运行脚本,则不需要垃圾收集器。脚本结束时,所有内容都将被清除。为此,你可以使用命令禁用垃圾收集器gc.disable()。稍后,你可以使用 重新启用它gc.enable()。

你还可以使用 手动运行收集周期gc.collect()。一个常见的应用是管理程序的性能密集型部分,该部分会生成许多临时对象。你可以在程序的该部分禁用垃圾收集,然后在最后手动运行收集并重新启用收集。

另一个有用的垃圾收集优化是gc.freeze(). 发出此命令时,垃圾收集器当前跟踪的所有内容都被“冻结”,或者被列为免于将来的收集扫描。这样,未来的扫描可以跳过这些对象。如果你有一个程序在启动之前导入库并设置大量内部状态,那么你可以gc.freeze()在所有工作完成后发出。这使垃圾收集器不必搜寻那些无论如何都不太可能被删除的东西。(如果你想对冻结的对象再次执行垃圾收集,请使用gc.unfreeze().)

使用 gc 调试垃圾收集

你还可以使用它gc来调试垃圾收集行为。如果你有过多的对象堆积在内存中并且没有被垃圾收集,你可以使用gc's 检查工具来找出可能持有对这些对象的引用的对象。

如果你想知道哪些对象持有对给定对象的引用,可以使用gc.get_referrers(obj)列出它们。你还可以使用gc.get_referents(obj)来查找给定对象引用的任何对象。

如果你不确定给定对象是否是垃圾收集的候选对象,gc.is_tracked(obj)请告诉你垃圾收集器是否跟踪该对象。如前所述,请记住垃圾收集器不会跟踪“原子”对象(例如整数)或仅包含原子对象的元素。

如果你想亲自查看正在收集哪些对象,可以使用 设置垃圾收集器的调试标志gc.set_debug(gc.DEBUG_LEAK|gc.DEBUG_STATS)。这会将有关垃圾收集的信息写入stderr。它将所有作为垃圾收集的对象保留在只读列表中。

避免 Python 内存管理中的陷阱

如前所述,如果你在某处仍有对它们的引用,则对象可能会堆积在内存中而不会被收集。这并不是 Python 垃圾收集本身的失败。垃圾收集器无法判断你是否不小心保留了对某物的引用。

让我们以一些防止对象永远不会被收集的指针作为结尾。

注意对象范围

如果你将对象 1 指定为对象 2 的属性(例如类),则对象 2 将需要超出范围,然后对象 1 才会:

obj1 = MyClass()
obj2.prop = obj1
로그인 후 복사

更重要的是,如果这种情况发生在某种其他操作的副作用中,例如将对象 2 作为参数传递给对象 1 的构造函数,你可能不会意识到对象 1 持有一个引用:

obj1 = MyClass(obj2)
로그인 후 복사

另一个例子:如果你将一个对象推入模块级列表并忘记该列表,则该对象将一直保留,直到从列表中删除,或者直到列表本身不再有任何引用。但是如果该列表是一个模块级对象,它可能会一直存在,直到程序终止。

简而言之,请注意你的对象可能被另一个看起来并不总是很明显的对象持有的方式。

使用 weakref避免引用循环

Python 的 weakref 模块允许你创建对其他对象的弱引用。弱引用不会增加对象的引用计数,因此只有弱引用的对象是垃圾回收的候选对象。

一个常见的用途weakref是对象缓存。你不希望仅仅因为它具有缓存条目而保留引用的对象,因此你将 aweakref用于缓存条目。

수동으로 참조 순환 끊기

마지막으로, 주어진 개체에 다른 개체에 대한 참조가 포함되어 있다는 것을 알고 있는 경우 언제든지 해당 개체에 대한 참조를 수동으로 끊을 수 있습니다. 예를 들어, 인스턴스_of_class.ref = other_object가 있는 경우, 인스턴스_of_class를 삭제할 준비가 되면 인스턴스_of_class.ref = None을 설정할 수 있습니다.

Python 메모리 관리 작동 방식을 이해함으로써 가비지 수집 시스템이 Python 프로그램에서 메모리 최적화에 어떻게 도움이 되는지, 그리고 표준 라이브러리 및 다른 곳에서 제공되는 모듈을 사용하여 메모리 사용 및 가비지 수집을 제어할 수 있는 방법을 살펴봅니다.

원제:​​Python 가비지 수집 및 gc 모듈​

위 내용은 Python 메모리 관리가 어떻게 작동하는지 이해하고 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

PS가 계속 로딩을 보여주는 이유는 무엇입니까? PS가 계속 로딩을 보여주는 이유는 무엇입니까? Apr 06, 2025 pm 06:39 PM

PS "로드"문제는 자원 액세스 또는 처리 문제로 인한 것입니다. 하드 디스크 판독 속도는 느리거나 나쁘다 : CrystalDiskinfo를 사용하여 하드 디스크 건강을 확인하고 문제가있는 하드 디스크를 교체하십시오. 불충분 한 메모리 : 고해상도 이미지 및 복잡한 레이어 처리에 대한 PS의 요구를 충족시키기 위해 메모리 업그레이드 메모리. 그래픽 카드 드라이버는 구식 또는 손상됩니다. 운전자를 업데이트하여 PS와 그래픽 카드 간의 통신을 최적화하십시오. 파일 경로는 너무 길거나 파일 이름에는 특수 문자가 있습니다. 짧은 경로를 사용하고 특수 문자를 피하십시오. PS 자체 문제 : PS 설치 프로그램을 다시 설치하거나 수리하십시오.

PS가 시작될 때 로딩 문제를 해결하는 방법은 무엇입니까? PS가 시작될 때 로딩 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:36 PM

부팅 할 때 "로드"에 PS가 붙어있는 여러 가지 이유로 인해 발생할 수 있습니다. 손상되거나 충돌하는 플러그인을 비활성화합니다. 손상된 구성 파일을 삭제하거나 바꾸십시오. 불충분 한 메모리를 피하기 위해 불필요한 프로그램을 닫거나 메모리를 업그레이드하십시오. 하드 드라이브 독서 속도를 높이기 위해 솔리드 스테이트 드라이브로 업그레이드하십시오. 손상된 시스템 파일 또는 설치 패키지 문제를 복구하기 위해 PS를 다시 설치합니다. 시작 오류 로그 분석의 시작 과정에서 오류 정보를 봅니다.

PS의 로딩 속도 속도를 높이는 방법? PS의 로딩 속도 속도를 높이는 방법? Apr 06, 2025 pm 06:27 PM

느린 Photoshop 스타트 업 문제를 해결하려면 다음을 포함한 다중 프론트 접근 방식이 필요합니다. 하드웨어 업그레이드 (메모리, 솔리드 스테이트 드라이브, CPU); 구식 또는 양립 할 수없는 플러그인 제거; 정기적으로 시스템 쓰레기 및 과도한 배경 프로그램 청소; 주의를 기울여 관련없는 프로그램 폐쇄; 시작하는 동안 많은 파일을 열지 않도록합니다.

PS가 파일을 열 때로드 문제를 해결하는 방법은 무엇입니까? PS가 파일을 열 때로드 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:33 PM

"로드"는 PS에서 파일을 열 때 말더듬이 발생합니다. 그 이유에는 너무 크거나 손상된 파일, 메모리 불충분, 하드 디스크 속도가 느리게, 그래픽 카드 드라이버 문제, PS 버전 또는 플러그인 충돌이 포함될 수 있습니다. 솔루션은 다음과 같습니다. 파일 크기 및 무결성 확인, 메모리 증가, 하드 디스크 업그레이드, 그래픽 카드 드라이버 업데이트, 의심스러운 플러그인 제거 또는 비활성화 및 PS를 다시 설치하십시오. 이 문제는 PS 성능 설정을 점차적으로 확인하고 잘 활용하고 우수한 파일 관리 습관을 개발함으로써 효과적으로 해결할 수 있습니다.

느린 PS로드가 컴퓨터 구성과 관련이 있습니까? 느린 PS로드가 컴퓨터 구성과 관련이 있습니까? Apr 06, 2025 pm 06:24 PM

PS 로딩이 느린 이유는 하드웨어 (CPU, 메모리, 하드 디스크, 그래픽 카드) 및 소프트웨어 (시스템, 백그라운드 프로그램)의 결합 된 영향 때문입니다. 솔루션에는 하드웨어 업그레이드 (특히 솔리드 스테이트 드라이브 교체), 소프트웨어 최적화 (시스템 쓰레기 청소, 드라이버 업데이트, PS 설정 확인) 및 PS 파일 처리가 포함됩니다. 정기적 인 컴퓨터 유지 보수는 또한 PS 달리기 속도를 향상시키는 데 도움이 될 수 있습니다.

PS가 항상 로딩되고 있음을 보여줄 때 로딩 문제를 해결하는 방법은 무엇입니까? PS가 항상 로딩되고 있음을 보여줄 때 로딩 문제를 해결하는 방법은 무엇입니까? Apr 06, 2025 pm 06:30 PM

PS 카드가 "로드"되어 있습니까? 솔루션에는 컴퓨터 구성 (메모리, 하드 디스크, 프로세서) 확인, 하드 디스크 조각 청소, 그래픽 카드 드라이버 업데이트, PS 설정 조정, PS 재설치 및 우수한 프로그래밍 습관 개발이 포함됩니다.

PDF 수출을 PS에 의해 배치로 내보낼 수 있습니까? PDF 수출을 PS에 의해 배치로 내보낼 수 있습니까? Apr 06, 2025 pm 04:54 PM

PS에서 PDF를 배치로 내보내는 세 가지 방법이 있습니다 : PS 동작 기능 사용 : 파일을 기록하고 열기 및 PDF 작업을 내보내고, 루프에서 동작을 실행합니다. 타사 소프트웨어의 도움으로 : 파일 관리 소프트웨어 또는 자동화 도구를 사용하여 입력 및 출력 폴더를 지정하고 파일 이름 형식을 설정하십시오. 스크립트 사용 : 스크립트를 작성하여 배치 내보내기 로직을 ​​사용자 정의하지만 프로그래밍 지식이 필요합니다.

PS 페더 링은 어떻게 전환의 부드러움을 제어합니까? PS 페더 링은 어떻게 전환의 부드러움을 제어합니까? Apr 06, 2025 pm 07:33 PM

깃털 통제의 열쇠는 점진적인 성격을 이해하는 것입니다. PS 자체는 그라디언트 곡선을 직접 제어하는 ​​옵션을 제공하지 않지만 여러 깃털, 일치하는 마스크 및 미세 선택으로 반경 및 구배 소프트를 유연하게 조정하여 자연스럽게 전이 효과를 달성 할 수 있습니다.

See all articles