18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 編程學習 >> Python >> 正文

Python和MicroPython之間的差異

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2023/11/7

MicroPython 編程最吸引人的方麵之一是它與(yu) 近二十年來在桌麵環境中廣泛使用的 CPython 相似。由於(yu) 幾乎相同的語法和設計範例,在嵌入式和桌麵開發環境之間移動幾乎是無縫的體(ti) 驗。這在物聯網時代是非常可取的,在這個(ge) 時代,來自嵌入式電子產(chan) 品的數據必須可以在眾(zhong) 多平台上訪問,包括移動、桌麵和雲(yun) 。如果工具和編程語言的變化最小化,開發人員可以保持精簡,產(chan) 品開發周期可以縮短。也就是說,與(yu) 桌麵計算相比,嵌入式硬件環境的本質要求 MicroPython 和 CPython 之間存在一些並非微不足道的差異。

注:CPython 是用 C 語言實現的 Python 解釋器,也是官方的並且是最廣泛使用的 Python 解釋器。除了 CPython 以外,還有用 JAVA 實現的 Jython 和用.NET 實現的 IronPython,使 Python 方便地和 JAVA 程序、.NET 程序集成。另外還有一些實驗性的 Python 解釋器比如 PyPy。

CPython 是使用字節碼的解釋器,任何程序源代碼在執行之前先要編譯成字節碼。它還有和幾種其它語言(包括 C 語言)交互的外部函數接口。

CPython 

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

CPython 開發人員可以訪問數百個(ge) 預構建模塊,隻需一行代碼即可將這些模塊輕鬆添加到他們(men) 的項目中。這些模塊消除了在尋求向項目添加功能時重新發明輪子的需要。但是,許多模塊在內(nei) 存利用率方麵可能非常大。MicroPython 要麽(me) 消除模塊,要麽(me) 提供專(zhuan) 為(wei) 嵌入式平台設計的模塊的定製實現。還有嵌入式平台獨有的模塊,例如與(yu) 通用 I/O (GPIO) 引腳的接口。

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

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

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

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

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

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

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

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

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

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

該environ屬性未實現。相反,開發人員必須使用getenv()、putenv()和unsetenv() 方法來設置和獲取環境變量。請注意,該getenv() 方法隻允許將一個(ge) 參數傳(chuan) 遞給它。

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

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

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

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

未實現在數組中搜索整數的功能。因此,以下代碼將導致錯誤:

import array as array a = array.array('i', [1, 2, 3, 4]) print(1 in a)

 

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

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

Tags:Python,MicroPython  
責任編輯:admin
請文明參與討論,禁止漫罵攻擊。 昵稱:注冊  登錄
[ 查看全部 ] 網友評論
關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁麵
下到頁底
晶體管查詢