0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python 和 MicroPython 之间的差异

吕珠峰 2022-12-28 09:51 次阅读

MicroPython 编程最吸引人的方面之一是它与近二十年来在桌面环境中广泛使用的 CPython 相似。由于几乎相同的语法和设计范例,在嵌入式和桌面开发环境之间移动几乎是无缝的体验。这在物联网时代是非常可取的,在这个时代,来自嵌入式电子产品的数据必须可以在众多平台上访问,包括移动、桌面和云。如果工具和编程语言的变化最小化,开发人员可以保持精简,产品开发周期可以缩短。也就是说,与桌面计算相比,嵌入式硬件环境的本质要求 MicroPython 和 CPython 之间存在一些并非微不足道的差异。

嵌入式电子生态系统在许多方面受到限制,而台式机或服务器则没有。首先,它们受到能源消耗的限制。许多嵌入式设备都是电池供电的,因此延长电池寿命在性能方面受到限制。台式计算机可能以几千兆赫兹的速度运行,而微控制器充其量只能以几十兆赫兹的速度运行。受限内存和存储也往往是显着影响 CPython 和 MicroPython 之间差异的限制因素。由于内存仅以千字节或兆字节为单位,内存密集型功能通常会减少甚至完全从 MicroPython 实现中删除。了解差异对于希望避免调试嵌入式代码的许多令人沮丧的时间的开发人员来说非常重要。

CPython 开发人员可以访问数百个预构建模块,只需一行代码即可将这些模块轻松添加到他们的项目中。这些模块消除了在寻求向项目添加功能时重新发明轮子的需要。但是,许多模块在内存利用率方面可能非常大。MicroPython 要么消除模块,要么提供专为嵌入式平台设计的模块的定制实现。还有嵌入式平台独有的模块,例如与通用 I/O (GPIO) 引脚的接口

CPython 使用自动引用计数作为其内存管理方式,而 MicroPython 使用垃圾收集。从实际的角度来看,当需要分配内存时,MicroPython 将尝试在堆上找到足够大小的内存块。如果失败,MicroPython 将寻求释放内存中未使用或冗余的对象。这是一个通常以毫秒为单位的过程。或者,开发人员可以偶尔gc.collect()以预定的时间间隔运行以清理内存,以确保垃圾收集不会在代码的关键部分发生。

语法差异可能是让大多数开发人员陷入困境的差异类型,特别是如果您有任何重要的 CPython 经验,这可能会给您编程时带来某种“肌肉记忆”。

MicroPython 要求文字数字和关键字之间有空格;相比之下,CPython 则不然。

MicroPython 允许使用 := 赋值给理解变量;CPython 引发语法错误。

使 Python 对编码新手友好的设计特性之一是它处理数据类型(例如整数、布尔值、浮点数)的方式。在 Python 中,所有数据类型都是类,变量是类的实例。然而,MicroPython 并没有实现整个 CPython 对象数据模型。值得注意的差异包括缺少多重继承、__new__ 和 __del__特殊方法可能不起作用、方法解析顺序不同以及不支持元类。

MicroPython 中未实现异常链接。因此,MicroPython 无法跨程序的不同抽象层重新抛出异常。

内置类型的处理方式不同。例如,MicroPython 不支持删除数组。

在 Python 中,函数是对象并且具有一组定义的属性,可以通过函数调用访问这些属性。例如,所有函数都有一个内置属性__doc__,它返回函数源代码中定义的文档字符串。函数的用户定义属性在 CPython 中是可能的;但是,MicroPython 不支持它们。这样做是因为嵌入式系统中通常会遇到内存限制。

覆盖sys.stdin, sys.stdout, 和sys.stderr是不可能的。这些是解释器用于标准输入、输出和错误的文件对象。这就是我们向用户显示文本并从用户那里获取输入的方式。

未能加载的模块仍被注册为已加载。这是为了使模块处理更有效率。因此,加载不包含异常处理。在部署到生产环境之前,一定要在开发环境中测试代码!

该environ属性未实现。相反,开发人员必须使用getenv()、putenv()和unsetenv() 方法来设置和获取环境变量。请注意,该getenv() 方法只允许将一个参数传递给它。

该print()函数不会像 CPython 那样检查递归数据结构(例如,递归列表)。MicroPython 会检查堆栈使用情况,因此打印递归数据结构不会因堆栈溢出而导致崩溃。

方法的错误消息可能会显示意外的参数计数,因为 MicroPython 将“self”计为参数。确保在处理错误消息时牢记这一事实。

JSON(JavaScript 对象表示法)是一种流行的数据交换格式,许多物联网终端设备使用它来与云高效通信。如果 JSON 对象不可序列化,MicroPython JSON 模块不会抛出异常。

该struct 模块在 Python 值和表示为 Python 字节对象的 C 结构之间进行转换。这允许有效处理存储在文件中或来自传感器常用的网络连接或串行协议的二进制数据。不幸的是,该struct.pack(format, v1, v2)函数不进行检查以确保为其提供了正确数量的参数。这与 CPython 实现形成对比,后者确实检查参数计数。

未实现在数组中搜索整数的功能。因此,以下代码将导致错误:

import array as array

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

print(1 in a)

CPython 会打印false,而 MicroPython 会返回未实现的错误消息。

MicroPython 是一种功能强大且易于使用的编程语言,用于开发嵌入式应用程序。但是,与用于创建桌面和云原生应用程序的功能更丰富的 Python 实现相比,它是有限的。一些差异可能会在未来的 MicroPython 版本中得到修复,或者随着新功能被添加到 Python 的参考实现中,可能会出现新的差异。要查看 CPython 和 MicroPython 之间的最新差异,请务必在其网站上查看 MicroPython 的官方文档。

审核编辑黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4782

    浏览量

    84453
收藏 人收藏

    评论

    相关推荐

    TPS65950和TPS65951之间的功能差异

    电子发烧友网站提供《TPS65950和TPS65951之间的功能差异.pdf》资料免费下载
    发表于 10-29 10:03 0次下载
    TPS65950和TPS65951<b class='flag-5'>之间</b>的功能<b class='flag-5'>差异</b>

    UCC3813 PWM系列和UCC3800 PWM系列之间差异

    电子发烧友网站提供《UCC3813 PWM系列和UCC3800 PWM系列之间差异.pdf》资料免费下载
    发表于 10-22 10:21 0次下载
    UCC3813 PWM系列和UCC3800 PWM系列<b class='flag-5'>之间</b>的<b class='flag-5'>差异</b>

    MSP430F67xx和MSP430F67-xxA器件之间差异

    电子发烧友网站提供《MSP430F67xx和MSP430F67-xxA器件之间差异.pdf》资料免费下载
    发表于 09-14 10:14 0次下载
    MSP430F67xx和MSP430F67-xxA器件<b class='flag-5'>之间</b>的<b class='flag-5'>差异</b>

    60V 容差板和标准 TPS272C45 评估模块之间差异

    电子发烧友网站提供《60V 容差板和标准 TPS272C45 评估模块之间差异.pdf》资料免费下载
    发表于 09-12 10:58 0次下载
    60V 容差板和标准 TPS272C45 评估模块<b class='flag-5'>之间</b>的<b class='flag-5'>差异</b>

    光学和磁性增量编码器之间差异应用说明

    电子发烧友网站提供《光学和磁性增量编码器之间差异应用说明.pdf》资料免费下载
    发表于 09-12 10:07 0次下载
    光学和磁性增量编码器<b class='flag-5'>之间</b>的<b class='flag-5'>差异</b>应用说明

    开关柜和环网柜之间有哪什么差异

    开关柜、环网柜之间差异分析
    的头像 发表于 07-16 15:37 482次阅读
    开关柜和环网柜<b class='flag-5'>之间</b>有哪什么<b class='flag-5'>差异</b>?

    opencv-python和opencv一样吗

    是OpenCV的一个Python语言接口,它允许开发者使用Python语言来调用OpenCV库的功能。 虽然OpenCV和OpenCV-Python在功能上有很多相似之处,但它们之间
    的头像 发表于 07-16 10:38 969次阅读

    ESP32下如何加自定义Python库?

    我看官方有提供Micropython的bin文件,但我想根据自己外设扩充一下Python库,这个应该从哪里入手? 之前做过RTT系统的python库扩充,RTT有提供Micropython
    发表于 06-18 06:27

    ESP32如何安装MicroPython库?

    ?? 【问题2】有Python的noise库,装还是不装?装了也是没用啊,环境是MicroPython 【请教】请问以上问题如何解决?
    发表于 06-05 07:55

    PLC和工控电脑之间存在哪些差异呢?

    PLC(可编程逻辑控制器)和工控电脑(工业控制计算机)都是工业自动化领域中的重要组成部分,但它们之间存在一些显著的差异
    的头像 发表于 03-14 09:24 1115次阅读

    浪涌电流、峰值电流和稳态电流之间差异

    浪涌电流、峰值电流和稳态电流之间差异  浪涌电流、峰值电流和稳态电流是在不同电路条件下出现的三种不同类型的电流。它们在性质和产生原因上存在差异。 首先,我们来讨论浪涌电流。浪涌电流是指电路中由于
    的头像 发表于 02-04 09:24 2770次阅读

    发电机,逆变器和UPS之间差异

    发电机,逆变器和UPS之间差异  发电机、逆变器和UPS(不间断电源)是现代电力供应和储备系统中常见的组件。尽管它们的目标都是提供持续和稳定的电力供应,但在设计、工作原理和适用场景上存在差异
    的头像 发表于 02-01 10:03 925次阅读

    比较AT和SC晶体振荡器之间差异

    比较AT和SC晶体振荡器之间差异  AT和SC晶体振荡器是两种常见的电子元件,用于产生高精度和稳定的时钟信号。虽然它们都能够产生稳定的时钟信号,但在工作原理、性能和应用方面存在一些差异。本文将详细
    的头像 发表于 01-25 13:51 550次阅读

    【科普小贴士】TVS二极管和齐纳二极管之间差异

    【科普小贴士】TVS二极管和齐纳二极管之间差异
    的头像 发表于 12-13 14:06 1061次阅读
    【科普小贴士】TVS二极管和齐纳二极管<b class='flag-5'>之间</b>的<b class='flag-5'>差异</b>

    细数心脏起搏器和ICD之间差异

    细数心脏起搏器和ICD之间差异
    的头像 发表于 11-29 15:07 1210次阅读