최적화¶
MicroPython은 RAM을 절약하면서도 프로그램의 효율적인 실행을 보장하기 위해 여러 가지 최적화를 사용합니다. 이 장에서는 이러한 최적화 중 일부를 다룹니다.
참고
MicroPython 문자열 인터닝(interning) 와 맵과 딕셔너리 에서는 문자열과 딕셔너리에 대한 다른 최적화를 자세히 설명합니다.
프로즌 바이트코드¶
MicroPython이 파일시스템에서 Python 코드를 로드할 때, 먼저 파일을 임시 인메모리 표현으로 파싱한 다음 실행을 위한 바이트코드를 생성해야 하며, 이 둘은 모두 힙(RAM)에 저장됩니다. 이로 인해 상당한 양의 메모리가 사용될 수 있습니다. MicroPython 크로스 컴파일러를 사용하면 Python 모듈에 대한 사전 컴파일된 바이트코드를 포함하는 .mpy 파일을 생성할 수 있습니다. 이는 여전히 RAM에 로드되지만 파싱 단계의 추가 오버헤드를 방지합니다.
추가적인 최적화로, .mpy 파일의 사전 컴파일된 바이트코드를 메인 펌웨어 컴파일 과정의 일부로 펌웨어 이미지에 “프리즈(freeze)”할 수 있으며, 이는 바이트코드가 ROM에서 실행됨을 의미합니다. 이를 통해 상당한 메모리 절약과 힙 단편화 감소를 얻을 수 있습니다.
자세한 내용은 MicroPython 매니페스트 파일 를 참조하십시오.
변수¶
MicroPython은 로컬 변수와 전역 변수를 다르게 처리합니다. 전역 변수는 힙에 할당된 전역 딕셔너리에 저장되고 조회됩니다(각 모듈은 자체적인 별도의 dict, 즉 별도의 네임스페이스를 갖는다는 점에 유의하십시오). 반면에 로컬 변수는 Python 값 스택에 저장되며, 이는 C 스택이나 힙에 위치할 수 있습니다. 로컬 변수는 Python 스택 내의 오프셋으로 직접 접근되며, 이는 dict에서의 전역 조회보다 더 효율적입니다.
식별자가 RAM에 저장되므로 전역 변수 이름의 길이도 사용되는 RAM 양에 영향을 미칩니다. 식별자가 짧을수록 사용되는 메모리가 적습니다.
다른 측면은 밑줄로 시작하는 const 변수가 진정한 상수로 취급되어 딕셔너리에 할당되거나 추가되지 않으므로 일부 메모리를 절약한다는 점입니다. 이러한 변수는 MicroPython 라이브러리의 const() 를 사용합니다. 따라서:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
다음으로 컴파일됩니다:
X = 1
foo(1, 2)
메모리 할당¶
대부분의 일반적인 MicroPython 구문은 힙에 할당되지 않습니다. 그러나 다음은 할당됩니다:
리스트, 매핑 등과 같은 동적 데이터 구조;
함수, 클래스, 객체 인스턴스;
import; 그리고
전역 변수의 최초 할당(전역 dict에 슬롯을 만들기 위해).
최적화에 대한 보다 사용자 중심적인 관점의 자세한 논의는 Maximising MicroPython speed 를 참조하십시오.