Python에서 변수와 메모리는 어떻게 관리됩니까? 스택과 힙이 있으며 메모리 관리에 사용되는 알고리즘은 무엇입니까? 이 지식을 감안할 때 많은 수 / 데이터 처리를위한 메모리 관리에 대한 권장 사항이 있습니까?
Python에서 변수와 메모리는 어떻게 관리됩니까? 스택과 힙이 있으며 메모리 관리에 사용되는 알고리즘은 무엇입니까? 이 지식을 감안할 때 많은 수 / 데이터 처리를위한 메모리 관리에 대한 권장 사항이 있습니까?
답변:
Python에서 변수와 메모리를 관리하는 방법.
자동으로! 아니요, 실제로는 객체를 생성하기 만하면 Python 가상 머신이 필요한 메모리를 처리하고 메모리 레이아웃에서 배치 할 위치를 처리합니다.
스택과 힙이 있으며 메모리 관리에 사용되는 알고리즘은 무엇입니까?
우리가 얘기 할 때 CPython
그것을 사용하는 개인 힙 오브젝트를 저장합니다. CPython C API 문서에서 :
Python의 메모리 관리에는 모든 Python 개체와 데이터 구조를 포함하는 개인 힙이 포함됩니다. 이 개인 힙의 관리는 Python 메모리 관리자에 의해 내부적으로 보장됩니다. Python 메모리 관리자에는 공유, 세분화, 사전 할당 또는 캐싱과 같은 다양한 동적 저장소 관리 측면을 처리하는 다양한 구성 요소가 있습니다.
메모리 재 확보는 대부분 참조 계산에 의해 처리됩니다 . 즉, Python VM은 개체를 참조하는 참조 수에 대한 내부 저널을 유지하고이를 참조하는 참조가 더 이상 없을 때 자동으로 가비지 수집합니다. 또한 도달 할 수 있는 모든 객체를 찾으려고하는 기존 GC 알고리즘 과 다소 반대로 도달 할 수없는 객체 "섬"을 감지하여 순환 참조 (참조 계산이 처리 할 수 없음) 를 끊는 메커니즘이 있습니다.
참고 : 이 정보는CPython
구체적이라는 점에 유의하십시오. 다른 파이썬과 같은 구현,pypy
,iron python
,jython
그것은 그들의 구현 세부 사항에 관해서 다른 사람들은 서로와 CPython과 다를 수 있습니다. 이를 더 잘 이해하려면 Python의 의미 (언어)와 기본 구현간에 차이가 있음을 이해하는 것이 도움이 될 수 있습니다.
이 지식을 감안할 때 많은 수 / 데이터 처리를위한 메모리 관리에 대한 권장 사항이 있습니까?
이제 이것에 대해 말할 수는 없지만 NumPy (숫자 처리를위한 가장 인기있는 파이썬 라이브러리)는 메모리 소비를 정상적으로 처리하는 메커니즘을 가지고 있다고 확신합니다.
Python의 내부에 대해 더 알고 싶다면 다음 리소스를 살펴보세요.
파이썬은없는 어떤 그런 일을.
Python은 언어 이며 구현 이 Python에서 정의한 의미를 얼마나 정확히 달성해야 하는지를 지정하지 않습니다 .
모든 구현 (CPython, PyPy, IronPython, Stackless , Jython ...)은 자체 작업을 자유롭게 수행 할 수 있습니다!
에서 C 파이썬, 모든 객체는 힙에 살고 :
Python의 메모리 관리에는 모든 Python 개체와 데이터 구조를 포함하는 개인 힙이 포함됩니다. 1
CPython 가상 머신은 스택 기반입니다.
>>> def g():
x = 1
y = 2
return f(x, y)
>>> import dis
>>> dis.dis(g)
2 0 LOAD_CONST 1 (1) # Push 1 onto the stack
3 STORE_FAST 0 (x) # Stores top of stack into local var x
3 6 LOAD_CONST 2 (2) # Push 2 onto stack
9 STORE_FAST 1 (y) # Store TOS into local var y
4 12 LOAD_GLOBAL 0 (f) # Push f onto stack
15 LOAD_FAST 0 (x) # Push x onto stack
18 LOAD_FAST 1 (y) # Push y onto stack
21 CALL_FUNCTION 2 # Execute function with 2
# f's return value is pushed on stack
24 RETURN_VALUE # Return TOS to caller (result of f)
이것은 CPython에만 해당됩니다. 스택에는 실제 값이 포함되어 있지 않지만 해당 개체에 대한 참조를 유지합니다.
1 : 소스