기준 : wikidocs
https://wikidocs.net/69557
변수
바인딩 : `=`, 변수가 어떤 값을 가리키는 것을 의미, 파이썬 인터프리터는 오른쪽을 먼저 해석,
객체가 메모리에 할당되고 할당된 객체의 주소를 a라는 변수가 가리킨다.
id 내장함수 : 할당된 주소 확인 >> id(a)로 확인
GC와 reference counting
파이썬에선 기본적으로 garbage collection(가비지 컬렉션)과 reference counting(레퍼런스 카운팅)을 통해 할당된 메모리를 관리한다.
어떤 값은 어떤 타입의 객체이다.
변수가 어떤 객체를 바인딩하면 객체의 레퍼런스 카운트 값이 증가한다.
레퍼런스 카운트(rc)는 누가 얼마만큼 참조하고 있는가를 따지는 것, 내가 선언한 메모리가 언제 소멸하는지!!
>> sys.getrefcount()로 확인
객체를 아무도 참조하지 않는 상황에 소멸하는 것 : 가비지 컬렉션의 소멸 대상이 되는 것
>> 소멸 대상이 되었다고 바로 소멸되는 것은 아니다.
>> rc가 1을 유지할 때 메모리가 지속적으로 유지되는 것.
- The compiler receives the source code.
- The compiler checks the syntax of each line in the source code.
- If the compiler encounters an error, it halts the translation process with an error message (Syntax error).
- Else if the instruction is well formatted, then it translates the source code to Bytecode.
- Bytecode is sent to the Python Virtual Machine (PVM)
- Bytecode along with the inputs and Library modules is given as the input to the PVM.
- PVM executes the Bytecode and if any error occurs, it displays an error message (Runtime error).
- Otherwise, if there is no error in execution, it results in the output.
CPython 과 Python의 차이
CPython에 의해 실행되는, 파이썬의 참조 구현체
구현체
Cpython : 내부는 C언어로 구현되어 있다. CPython이라고 한다. 각 CPython 인터프리터 프로세스 에서 GIL ( Global Interpreter Lock ) 을 사용한다는 것입니다. 즉, 단일 프로세스 내에서 한 번에 하나의 스레드만 Python 바이트 코드를 처리 할 수 있다. 이것은 멀티 스레딩에 아무런 의미가 없다는 것을 의미하지는 않는다. 가장 일반적인 멀티 스레딩 시나리오는 스레드가 대부분 외부 프로세스가 완료되기를 기다리는 경우이다.
Jython : Java로 구현한 Jython(자이썬)이 있다. Jython은 모든 JVM(자바 가상 머신)이 실행할 수 있다.
Pypy : Python으로 구현한 pypy도 존재한다. pypy는 파이썬의 부분집합인 RPython으로 구현되어 있다. 현재의 CPython보다 높은 성능을 내도록 하는 것이 프로젝트의 주된 목표이다. 공식 사이트에 따르면 pypy7.1 버전은 Cpython2.7.11 버전보다 4배 이상의 성능을 보인다고 한다.
pypy vs cpython 속도 비교
pypy는 JIT컴파일을 제공하는 인터프리터기
실제로 PyPy가 하는 일은 크게 두 가지이다.
- RPython 언어로 동적 언어의 인터프리터를 구현할 수 있게 해주는 프레임워크
- RPython으로 구현된 Python
JIT(Just-In-Time)
동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 이 기법은 프로그램의 실행 속도를 빠르게 하기 위해 사용된다. 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후에 해당 메서드를 더이상 인터프리팅하지 않고 네이티브 코드로 직접 실행하는 방식.
Cpython
https://www.youtube.com/watch?v=KSNIslmwPyI
Cython
Cython 은 CPython 확장 모듈을 생성하고 이를 이용하여 외부 함수 인터페이스와 실행 속도 향상과 외부 라이브러리의 연동을 보다 향상 시킬 수 있도록 고안된 컴파일 언어이다. python의 경우 구조적으로 멀티프로세스를 실행하는데 어려움이 있고 또한 인터프린터 언어이다 보니 컴파일 언어보다 성능이 현저히 떨어지는 단점을 가지고 있다. 이러한 파이썬의 고질적인 단점을 극복하고자 cython이 등장한다.
Cython 은 pyx 확장명을 사용하고, 컴파일 과정을 통하여 파이썬에서 import 형태로 사용될 수 있다.
컴파일은 다음 setup.py 를 이용하여 컴파일할 수 있다.
ex) scipy, pandas
객체의 레퍼런스 카운트가 0이 되면 파이썬 인터프리터 해당 객체에 대한 메모리 할당을 해제한다.
이런 방식은 CPython의 가비지 콜렉션의 기본 메커니즘이다.
CPython은 여기에 추가로 세대별 가비지 컬렉션(General Garbage Collection)을 사용한다.
+ plus)
Java Virtual machine vs Python Virtual machine
https://stackoverflow.com/questions/441824/java-virtual-machine-vs-python-interpreter-parlance
- llvm: cpu registers
- Java: primitive data types
- Python: user-defined types
Reference
- Python GC( https://blog.winterjung.dev/2018/02/18/python-gc , https://taejunejoung.github.io/2019/12/10/python-middle-gc/ )
- compileal - 파이썬 라이브러리 바이트 컴파일하기 ( https://docs.python.org/ko/dev/library/compileall.html )
- dis - 파이썬 바이트 코드역 어셈블러 ( https://docs.python.org/ko/dev/library/dis.html )
- 실행 cython (https://uiandwe.tistory.com/1331 )
- cython tutorial (https://cython.org/)
- cpython 책 더보기( http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966263677&orderClick=LAG&Kc= )
- Python Code Run (https://www.c-sharpcorner.com/article/why-learn-python-an-introduction-to-python/)
'Back > Python' 카테고리의 다른 글
[django] 장고 이해하기 - 1 MVC, MVT 모델 (0) | 2022.10.19 |
---|