0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python 和 MicroPython 之間的差異

呂珠峰 ? 2022-12-28 09:51 ? 次閱讀

MicroPython 編程最吸引人的方面之一是它與近二十年來在桌面環(huán)境中廣泛使用的 CPython 相似。由于幾乎相同的語法和設計范例,在嵌入式和桌面開發(fā)環(huán)境之間移動幾乎是無縫的體驗。這在物聯(lián)網(wǎng)時代是非??扇〉?,在這個時代,來自嵌入式電子產品的數(shù)據(jù)必須可以在眾多平臺上訪問,包括移動、桌面和云。如果工具和編程語言的變化最小化,開發(fā)人員可以保持精簡,產品開發(fā)周期可以縮短。也就是說,與桌面計算相比,嵌入式硬件環(huán)境的本質要求 MicroPython 和 CPython 之間存在一些并非微不足道的差異。

嵌入式電子生態(tài)系統(tǒng)在許多方面受到限制,而臺式機或服務器則沒有。首先,它們受到能源消耗的限制。許多嵌入式設備都是電池供電的,因此延長電池壽命在性能方面受到限制。臺式計算機可能以幾千兆赫茲的速度運行,而微控制器充其量只能以幾十兆赫茲的速度運行。受限內存和存儲也往往是顯著影響 CPython 和 MicroPython 之間差異的限制因素。由于內存僅以千字節(jié)或兆字節(jié)為單位,內存密集型功能通常會減少甚至完全從 MicroPython 實現(xiàn)中刪除。了解差異對于希望避免調試嵌入式代碼的許多令人沮喪的時間的開發(fā)人員來說非常重要。

CPython 開發(fā)人員可以訪問數(shù)百個預構建模塊,只需一行代碼即可將這些模塊輕松添加到他們的項目中。這些模塊消除了在尋求向項目添加功能時重新發(fā)明輪子的需要。但是,許多模塊在內存利用率方面可能非常大。MicroPython 要么消除模塊,要么提供專為嵌入式平臺設計的模塊的定制實現(xiàn)。還有嵌入式平臺獨有的模塊,例如與通用 I/O (GPIO) 引腳的接口。

CPython 使用自動引用計數(shù)作為其內存管理方式,而 MicroPython 使用垃圾收集。從實際的角度來看,當需要分配內存時,MicroPython 將嘗試在堆上找到足夠大小的內存塊。如果失敗,MicroPython 將尋求釋放內存中未使用或冗余的對象。這是一個通常以毫秒為單位的過程?;蛘?,開發(fā)人員可以偶爾gc.collect()以預定的時間間隔運行以清理內存,以確保垃圾收集不會在代碼的關鍵部分發(fā)生。

語法差異可能是讓大多數(shù)開發(fā)人員陷入困境的差異類型,特別是如果您有任何重要的 CPython 經驗,這可能會給您編程時帶來某種“肌肉記憶”。

MicroPython 要求文字數(shù)字和關鍵字之間有空格;相比之下,CPython 則不然。

MicroPython 允許使用 := 賦值給理解變量;CPython 引發(fā)語法錯誤。

使 Python 對編碼新手友好的設計特性之一是它處理數(shù)據(jù)類型(例如整數(shù)、布爾值、浮點數(shù))的方式。在 Python 中,所有數(shù)據(jù)類型都是類,變量是類的實例。然而,MicroPython 并沒有實現(xiàn)整個 CPython 對象數(shù)據(jù)模型。值得注意的差異包括缺少多重繼承、__new__ 和 __del__特殊方法可能不起作用、方法解析順序不同以及不支持元類。

MicroPython 中未實現(xiàn)異常鏈接。因此,MicroPython 無法跨程序的不同抽象層重新拋出異常。

內置類型的處理方式不同。例如,MicroPython 不支持刪除數(shù)組。

在 Python 中,函數(shù)是對象并且具有一組定義的屬性,可以通過函數(shù)調用訪問這些屬性。例如,所有函數(shù)都有一個內置屬性__doc__,它返回函數(shù)源代碼中定義的文檔字符串。函數(shù)的用戶定義屬性在 CPython 中是可能的;但是,MicroPython 不支持它們。這樣做是因為嵌入式系統(tǒng)中通常會遇到內存限制。

覆蓋sys.stdin, sys.stdout, 和sys.stderr是不可能的。這些是解釋器用于標準輸入、輸出和錯誤的文件對象。這就是我們向用戶顯示文本并從用戶那里獲取輸入的方式。

未能加載的模塊仍被注冊為已加載。這是為了使模塊處理更有效率。因此,加載不包含異常處理。在部署到生產環(huán)境之前,一定要在開發(fā)環(huán)境中測試代碼!

該environ屬性未實現(xiàn)。相反,開發(fā)人員必須使用getenv()、putenv()和unsetenv() 方法來設置和獲取環(huán)境變量。請注意,該getenv() 方法只允許將一個參數(shù)傳遞給它。

該print()函數(shù)不會像 CPython 那樣檢查遞歸數(shù)據(jù)結構(例如,遞歸列表)。MicroPython 會檢查堆棧使用情況,因此打印遞歸數(shù)據(jù)結構不會因堆棧溢出而導致崩潰。

方法的錯誤消息可能會顯示意外的參數(shù)計數(shù),因為 MicroPython 將“self”計為參數(shù)。確保在處理錯誤消息時牢記這一事實。

JSON(JavaScript 對象表示法)是一種流行的數(shù)據(jù)交換格式,許多物聯(lián)網(wǎng)終端設備使用它來與云高效通信。如果 JSON 對象不可序列化,MicroPython JSON 模塊不會拋出異常。

該struct 模塊在 Python 值和表示為 Python 字節(jié)對象的 C 結構之間進行轉換。這允許有效處理存儲在文件中或來自傳感器常用的網(wǎng)絡連接或串行協(xié)議的二進制數(shù)據(jù)。不幸的是,該struct.pack(format, v1, v2)函數(shù)不進行檢查以確保為其提供了正確數(shù)量的參數(shù)。這與 CPython 實現(xiàn)形成對比,后者確實檢查參數(shù)計數(shù)。

未實現(xiàn)在數(shù)組中搜索整數(shù)的功能。因此,以下代碼將導致錯誤:

import array as array

a = array.array('i', [1, 2, 3, 4])

print(1 in a)

CPython 會打印false,而 MicroPython 會返回未實現(xiàn)的錯誤消息。

MicroPython 是一種功能強大且易于使用的編程語言,用于開發(fā)嵌入式應用程序。但是,與用于創(chuàng)建桌面和云原生應用程序的功能更豐富的 Python 實現(xiàn)相比,它是有限的。一些差異可能會在未來的 MicroPython 版本中得到修復,或者隨著新功能被添加到 Python 的參考實現(xiàn)中,可能會出現(xiàn)新的差異。要查看 CPython 和 MicroPython 之間的最新差異,請務必在其網(wǎng)站上查看 MicroPython 的官方文檔。

審核編輯黃昊宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • python
    +關注

    關注

    54

    文章

    4758

    瀏覽量

    84293
收藏 人收藏

    評論

    相關推薦

    光學和磁性增量編碼器之間差異應用說明

    電子發(fā)燒友網(wǎng)站提供《光學和磁性增量編碼器之間差異應用說明.pdf》資料免費下載
    發(fā)表于 09-12 10:07 ?0次下載
    光學和磁性增量編碼器<b class='flag-5'>之間</b>的<b class='flag-5'>差異</b>應用說明

    開關柜和環(huán)網(wǎng)柜之間有哪什么差異

    開關柜、環(huán)網(wǎng)柜之間差異分析
    的頭像 發(fā)表于 07-16 15:37 ?421次閱讀
    開關柜和環(huán)網(wǎng)柜<b class='flag-5'>之間</b>有哪什么<b class='flag-5'>差異</b>?

    opencv-python和opencv一樣嗎

    是OpenCV的一個Python語言接口,它允許開發(fā)者使用Python語言來調用OpenCV庫的功能。 雖然OpenCV和OpenCV-Python在功能上有很多相似之處,但它們之間
    的頭像 發(fā)表于 07-16 10:38 ?685次閱讀

    ESP32下如何加自定義Python庫?

    我看官方有提供Micropython的bin文件,但我想根據(jù)自己外設擴充一下Python庫,這個應該從哪里入手? 之前做過RTT系統(tǒng)的python庫擴充,RTT有提供Micropython
    發(fā)表于 06-18 06:27

    ESP32如何安裝MicroPython庫?

    ?? 【問題2】有Python的noise庫,裝還是不裝?裝了也是沒用啊,環(huán)境是MicroPython 【請教】請問以上問題如何解決?
    發(fā)表于 06-05 07:55

    PLC和工控電腦之間存在哪些差異呢?

    PLC(可編程邏輯控制器)和工控電腦(工業(yè)控制計算機)都是工業(yè)自動化領域中的重要組成部分,但它們之間存在一些顯著的差異。
    的頭像 發(fā)表于 03-14 09:24 ?1022次閱讀

    浪涌電流、峰值電流和穩(wěn)態(tài)電流之間差異

    浪涌電流、峰值電流和穩(wěn)態(tài)電流之間差異? 浪涌電流、峰值電流和穩(wěn)態(tài)電流是在不同電路條件下出現(xiàn)的三種不同類型的電流。它們在性質和產生原因上存在差異。 首先,我們來討論浪涌電流。浪涌電流是指電路中由于
    的頭像 發(fā)表于 02-04 09:24 ?2413次閱讀

    比較AT和SC晶體振蕩器之間差異

    比較AT和SC晶體振蕩器之間差異? AT和SC晶體振蕩器是兩種常見的電子元件,用于產生高精度和穩(wěn)定的時鐘信號。雖然它們都能夠產生穩(wěn)定的時鐘信號,但在工作原理、性能和應用方面存在一些差異。本文將詳細
    的頭像 發(fā)表于 01-25 13:51 ?484次閱讀

    【科普小貼士】TVS二極管和齊納二極管之間差異

    【科普小貼士】TVS二極管和齊納二極管之間差異
    的頭像 發(fā)表于 12-13 14:06 ?967次閱讀
    【科普小貼士】TVS二極管和齊納二極管<b class='flag-5'>之間</b>的<b class='flag-5'>差異</b>

    細數(shù)心臟起搏器和ICD之間差異

    細數(shù)心臟起搏器和ICD之間差異
    的頭像 發(fā)表于 11-29 15:07 ?1140次閱讀

    如何運行Python程序

    需要安裝Python解釋器。Python有兩個主要版本,即Python 2和Python 3,兩個版本的語法有些微小的差異。你可以根據(jù)自己的
    的頭像 發(fā)表于 11-24 09:31 ?1071次閱讀

    Python2與Python3的差異

    Python2與Python3是兩個不同的版本,它們在語法、功能和性能等方面存在一些差異。下面是對Python2和Python3的詳盡、詳實
    的頭像 發(fā)表于 11-23 16:48 ?814次閱讀

    網(wǎng)絡虛擬化、NFV和SDN之間差異

    電子發(fā)燒友網(wǎng)站提供《網(wǎng)絡虛擬化、NFV和SDN之間差異.pdf》資料免費下載
    發(fā)表于 11-10 15:54 ?0次下載
    網(wǎng)絡虛擬化、NFV和SDN<b class='flag-5'>之間</b>的<b class='flag-5'>差異</b>

    Ruby 與 Python之間差異

    Ruby 與 Python 之間差異在很大程度上可通過 for 循環(huán)看出本質。 Python 擁有 for 語句。對象告訴 for 如何進行協(xié)作,而 for 的循環(huán)體會處理對象返回的
    的頭像 發(fā)表于 10-30 11:50 ?554次閱讀

    在基于AT32 RT-Thread的源碼包中開啟并下載Micropython開源包

    Micropython Based On AT32 RTT講述如何在基于AT32 RT-Thread 的源碼包中開啟并下載Micropython 開源包,并簡單描述和展示了Micropython 在AT32 系列MCU 上正常運
    發(fā)表于 10-25 07:06