Các tối ưu hóa¶
MicroPython sử dụng một số tối ưu hóa để tiết kiệm RAM nhưng cũng đảm bảo việc thực thi chương trình hiệu quả. Chương này thảo luận về một số tối ưu hóa này.
Ghi chú
Nội hóa chuỗi (string interning) trong MicroPython và Maps và Dictionaries mô tả chi tiết các tối ưu hóa khác về chuỗi và từ điển.
Bytecode đóng băng¶
Khi MicroPython tải mã Python từ hệ thống tệp, trước tiên nó phải phân tích cú pháp tệp thành một biểu diễn tạm thời trong bộ nhớ, sau đó tạo bytecode để thực thi, cả hai đều được lưu trữ trong heap (trong RAM). Điều này có thể dẫn đến việc sử dụng lượng bộ nhớ đáng kể. Trình biên dịch chéo MicroPython có thể được sử dụng để tạo ra một tệp .mpy, chứa bytecode được biên dịch trước cho một module Python. Tệp này vẫn sẽ được tải vào RAM, nhưng nó tránh được chi phí bổ sung của giai đoạn phân tích cú pháp.
Như một tối ưu hóa thêm, bytecode được biên dịch trước từ một tệp .mpy có thể được "đóng băng" vào ảnh firmware như một phần của quá trình biên dịch firmware chính, có nghĩa là bytecode sẽ được thực thi từ ROM. Điều này có thể dẫn đến tiết kiệm bộ nhớ đáng kể và giảm phân mảnh heap.
Xem Tệp manifest MicroPython để biết thêm thông tin.
Biến¶
MicroPython xử lý các biến cục bộ và toàn cục khác nhau. Các biến toàn cục được lưu trữ và tra cứu từ một từ điển toàn cục được cấp phát trên heap (lưu ý rằng mỗi module có từ điển riêng biệt của nó, tức là không gian tên riêng biệt). Ngược lại, các biến cục bộ được lưu trữ trên ngăn xếp giá trị Python, có thể nằm trên ngăn xếp C hoặc trên heap. Chúng được truy cập trực tiếp bằng offset của chúng trong ngăn xếp Python, hiệu quả hơn so với việc tra cứu toàn cục trong một từ điển.
Độ dài của tên biến toàn cục cũng ảnh hưởng đến lượng RAM được sử dụng vì các định danh được lưu trữ trong RAM. Định danh càng ngắn, càng ít bộ nhớ được sử dụng.
Khía cạnh khác là các biến const bắt đầu bằng dấu gạch dưới được coi là các hằng số thực sự và không được cấp phát hoặc thêm vào từ điển, do đó tiết kiệm một số bộ nhớ. Các biến này sử dụng const() từ thư viện MicroPython. Do đó:
from micropython import const
X = const(1)
_Y = const(2)
foo(X, _Y)
Biên dịch thành:
X = 1
foo(1, 2)
Cấp phát bộ nhớ¶
Hầu hết các cấu trúc MicroPython phổ biến không được cấp phát trên heap. Tuy nhiên, các mục sau thì có:
Các cấu trúc dữ liệu động như danh sách, ánh xạ, v.v.;
Hàm, lớp và các thể hiện đối tượng;
các lần nhập; và
Lần gán đầu tiên của các biến toàn cục (để tạo slot trong từ điển toàn cục).
Để thảo luận chi tiết về quan điểm tập trung vào người dùng hơn về tối ưu hóa, xem Maximising MicroPython speed.