Optimisasi

MicroPython menggunakan beberapa optimisasi untuk menghemat RAM sekaligus memastikan eksekusi program yang efisien. Bab ini membahas beberapa optimisasi tersebut.

Catatan

Interning string MicroPython dan Map dan Kamus merinci optimisasi lain pada string dan dictionary.

Bytecode beku

Ketika MicroPython memuat kode Python dari filesystem, pertama-tama ia harus mengurai file tersebut ke dalam representasi sementara dalam memori, lalu menghasilkan bytecode untuk eksekusi, keduanya disimpan di heap (dalam RAM). Hal ini dapat menyebabkan jumlah memori yang signifikan digunakan. Kompilator silang MicroPython dapat digunakan untuk menghasilkan file .mpy, yang berisi bytecode yang sudah dikompilasi sebelumnya untuk modul Python. Ini masih akan dimuat ke dalam RAM, tetapi menghindari overhead tambahan dari tahap penguraian.

Sebagai optimisasi lebih lanjut, bytecode yang sudah dikompilasi sebelumnya dari file .mpy dapat "dibekukan" ke dalam citra firmware sebagai bagian dari proses kompilasi firmware utama, yang berarti bytecode akan dieksekusi dari ROM. Hal ini dapat menghasilkan penghematan memori yang signifikan, dan mengurangi fragmentasi heap.

Lihat File manifest MicroPython untuk informasi lebih lanjut.

Variabel

MicroPython memproses variabel lokal dan global secara berbeda. Variabel global disimpan dan dicari dari dictionary global yang dialokasikan di heap (perhatikan bahwa setiap modul memiliki dict terpisahnya sendiri, sehingga namespace terpisah). Variabel lokal di sisi lain disimpan di stack nilai Python, yang mungkin berada di stack C atau di heap. Mereka diakses langsung berdasarkan offset mereka dalam stack Python, yang lebih efisien daripada pencarian global dalam sebuah dict.

Panjang nama variabel global juga memengaruhi seberapa banyak RAM yang digunakan karena pengenal disimpan dalam RAM. Semakin pendek pengenal, semakin sedikit memori yang digunakan.

Aspek lainnya adalah bahwa variabel const yang dimulai dengan garis bawah diperlakukan sebagai konstanta yang sebenarnya dan tidak dialokasikan atau ditambahkan dalam sebuah dictionary, sehingga menghemat sebagian memori. Variabel-variabel ini menggunakan const() dari pustaka MicroPython. Oleh karena itu:

from micropython import const

X = const(1)
_Y = const(2)
foo(X, _Y)

Dikompilasi menjadi:

X = 1
foo(1, 2)

Alokasi memori

Sebagian besar konstruksi MicroPython yang umum tidak dialokasikan di heap. Namun berikut ini yang dialokasikan:

  • Struktur data dinamis seperti list, mapping, dll.;

  • Fungsi, kelas, dan instans objek;

  • impor; dan

  • Penugasan pertama variabel global (untuk membuat slot dalam dict global).

Untuk diskusi terperinci dari perspektif yang lebih berorientasi pengguna tentang optimisasi, lihat Maximising MicroPython speed.