- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
哈喽大家好,我是咸鱼 。
当我们说 Python 时,通常指的是官方实现的 CPython 。
但还有很多比如 Pypy、Jython、MicroPython、Brython、RustPython 等 “python” 。
许多小伙伴看到这些带 “python” 的概念可能一头雾水,心想这跟我平时接触到的 python 有什么区别吗?这些到底是什么 。
那么今天这篇文章将跟大家介绍相关的概念 。
参考链接:
What's the deal with CPython, Pypy, MicroPython, Jython...? (bitecode.dev) 。
在开始这篇文章之前,我们首先需要了解一个东西——python 是什么?
python 实际上是一个语言规范 ,这个规范定义了 Python 这门语言应该具备哪些语言要素,应当能完成什么样的任务 。
Python 语言规范可以用不同的方式实现,可以用 C 实现,也可以用 C++、Java、C#、JavaScript,甚至使用 Python 自己实现 。
python 最初是由龟哥(Guido van Rossum)用 C 编写的(CPython) 。
在 python 大获成功之后,许多其他的项目开始用其他的编程语言或者不同的目标去重新编写 python 。
那么这些项目中的每一个 python 实现都需要一个名字去区别于最初的那个 python(龟哥写的那个) 。
所以这就是 Pypy、MicroPython、Iron Python、Jython 和 Pyston 等丰富多彩的名字出现的原因 。
CPython 。
当我们在讨论 python 的时候,99% 的情况下指的是 CPython,CPython 指的是用 C 编写的 pyhton 实现 。
CPython 是标准 python,可以将 Python 源码编译成 CPython 字节码,由虚拟机解释执行这些字节码 。
一般情况下,CPython 是最常用的 python 实现,大多数开发人员基本不会使用到 CPython 之外的 python 实现,甚至都不会去讨论 。
Pypy 。
Pypy 是最著名的 CPython 替代品,它是用 python 编写的(你没听错,用 python 编写的 python 实现) 。
实际上 Pypy 是由 RPython 实现的,RPython 是 Python 的一个子集 。
Pypy 使用即时编译(JIT)技术,可以在运行时将 Python 代码动态地编译成机器码,从而提供更高的执行速度 。
虽然 Pypy 执行速度要比 CPython 快,但是它的启动速度要比 CPython 慢,如果运行的时间足够长的话,就会变得越来越快 。
这使得它对于长时间运行的进程特别有用,例如守护进程、任务队列和web服务器 。
还有一个缺点就是 Pypy 与许多使用 C 编写的 Python 拓展库不兼容 。
虽然 Pypy 提供了一些与 CPython C API 兼容的接口,但并不能保证所有的 C 拓展都能无缝运行 。
Stackless Python 。
Stackless Python 是一种 Python 的变体,它是在 CPython 的基础上进行扩展和改进的版本 。
与传统的 CPython 相比,Stackless Python 提供了一些额外的特性,其中最重要的是支持协程(coroutine)和微线程(microthreads) 。
协程是一种轻量级的线程,它允许在同一个线程内的多个协程之间进行切换,从而实现并发执行 。
Stackless Python 的协程实现基于任务切换的概念,可以方便地编写异步、非阻塞的代码,提高程序的并发性和响应性 。
微线程是 Stackless Python 中的另一个概念,它是一种更轻量级的线程单位,可以在一个进程内并发地执行多个微线程 。
微线程与操作系统线程的切换开销较小,可以更高效地处理大量的并发任务 。
Stackless Python 并不是 Python 的官方版本,它是由 Christian Tismer 和其他贡献者开发和维护的一个项目 。
Stackless Python 的一个简单应用:
import stackless
# 定义一个协程函数
def task(name):
print("Running task:", name)
# 模拟任务执行
stackless.sleep(1)
print("Task", name, "completed")
# 创建协程
task1 = stackless.tasklet(task)("Task 1")
task2 = stackless.tasklet(task)("Task 2")
# 运行协程调度器
stackless.run()
Jython 。
Jython(Java Python 的缩写)由 Java 编写,运行在 Java 虚拟机上( Java Virtual Machine,JVM) 。
它允许开发人员使用 Python 语言编写和执行 Java 应用程序,可以在Jython中直接访问Java类和方法 。
它提供了对 Java 类和库的无缝集成,使得开发人员可以利用 Java 平台的功能和生态系统 。
Jython 广泛应用于 Java 开发中,尤其是需要结合 Python 脚本和 Java 代码的场景 。
jython 的一个简单应用:
# 导入Java类
from java.util import ArrayList
# 创建一个Java ArrayList对象
list = ArrayList()
# 向列表中添加元素
list.add("Hello")
list.add("World")
# 使用Python的for循环遍历列表
for item in list:
print(item)
IronPython 。
IronPython 与 Jython 类似,它是 .NET 框架的 python 实现 。
它使用了微软开发的动态语言运行时(DLR)和公共语言运行时(CLR),能够与.NET框架无缝集成 。
开发人员可以在 .NET 平台上编写和执行 Python 代码,利用 .NET 框架的功能和资源 。
IronPython 的一个简单应用:
import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
from System.Windows.Forms import Application, Form, Button
from System.Drawing import Point
# 创建窗体类
class MyForm(Form):
def __init__(self):
self.Text = "IronPython Form Example"
self.button = Button()
self.button.Text = "Click Me"
self.button.Location = Point(50, 50)
self.button.Click += self.button_Click
self.Controls.Add(self.button)
def button_Click(self, sender, event):
self.button.Text = "Clicked!"
# 创建应用程序并运行窗体
Application.Run(MyForm())
MicroPython 。
根据字面意思可以得知—— MicroPython 是一种精简版的 python 实现 。
它只包含了 python 标准库中的一小部分并经过优化,以适应资源受限的环境,专为嵌入式系统和物联网设备而设计 。
MicroPython具有以下特点:
总结一下 。
Python 实际上是一个语言规范,可以用不同的方式实现 。
为了能够实现在特定的应用场景中具有不同的优势和用途,开发人员用其他语言设计了不同的 python 实现 。
CPython 是最常用的 Python 实现,它是官方用 C 编写的 python 实现 。
除此之外还有像 jython、Pypy、Iron Python、Stackless Python 等 。
最后此篇关于CPython,Pypy,MicroPython...还在傻傻分不清楚?的文章就讲到这里了,如果你想了解更多关于CPython,Pypy,MicroPython...还在傻傻分不清楚?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想为我为 micro:bit 编写的 micropython 代码编写测试。这里的示例使用 doctest。我愿意为任何测试系统解决问题。 名为 testing_python.py 的工作 pyth
我正在尝试将以下内容从 Javascript 转换为 micro:bit 的 MicroPython。这是来自发明者工具包的代码示例 3,从块转换为 Javascript。 let light_sta
我在 Micropython 1.9.3 .我知道如何使用 mpy-cross 将 .py 转换为可以由 Micropython 虚拟机执行的已编译 python .mpy。 问题是,如果我尝试使用
如前所述,here通过Micropython套接字接收消息会导致留下一个字节字符串以供使用。 我的问题是如何将此字节字符串转换为另一种可用格式? 我已经尝试过类似的方法: data = s.recv(
我有一个 microbit 项目,其中 microbit 垂直插入 kiktronics 机器人。 我想得到机器人的航向,但是 compass.heading() 只有微位是水平的才有效。我尝试使用
我在 bbc microbit 上运行 micropython。 我的 microbit 没有运行闪存中的程序,它正在显示0, 5, 0, SAD_FACE 那个动画是什么意思? 最佳答案 悲伤的脸表
我是电子产品新手,并且一直在使用 esp8266 和 Micropython。我正在尝试让几个链接的移位寄存器 (sn74hc595) 来控制 16 个 LED,但我很难理解我得到的结果。 我的脚本如
我需要使用 MAX31865 SPI 通信读取温度数据。首先,我尝试读取 4 字节数据: import machine import ubinascii spi = machine.SPI(1, ba
我可以在 esp8266 micropython 中使用 Sympy 库吗? 我尝试使用 ampy 安装它,但它返回错误 我想求解线性方程: 例如: from sympy import symbols
我只是在 LEGO EV3 单元上尝试一些 MicroPython 脚本,我正在努力寻找任何文档/示例来告诉我如何检查线程是否正在运行。 def newMethod(): print("new
哈喽大家好,我是咸鱼 当我们说 Python 时,通常指的是官方实现的 CPython 但还有很多比如 Pypy、Jython、MicroPython、Brython、RustPytho
我有一个运行MicroPython的NodeMCU ESP8266开发板。我在ESP8266上运行一个Web服务器。这是我基于这些板之一的第一个物联网项目。 下面是代码片段。 这是在main.py中执
我最近尝试在 ESP8266 板上加载 MicroPython,但失败了。为此,我必须安装 esptool。我成功安装了它,但是当我想使用它时,它不起作用。 例如, esptool.py --help
大多数 Micropython 端口都包含一个 ' micropython ' 模块,它有一个名为 ' const() 的特定函数'。我相信它的行为很像' #define ' 但是,在 C 中,它只接
我有一个奇怪的问题。当我在线解析正则表达式时,它工作正常,但在 MicroPython 中不匹配。 正则表达式: ()*(.*?)()*或(.*?)或(.*?) 匹配: <Storage {}&
我成功地将我的 ESP32 连接到 WebSocket 服务器。现在我正试图让它与 SSL 一起工作。我试过这个简单的代码来连接到 www.google.com。我用它来生成证书和 key 。 ope
我曾经读过关于最小化 python 安装,没有很多 python 默认安装附带的库,但在网上找不到它...... 我想做的是用执行它所需的 python 东西打包一个脚本并使其可移植。 有人知道这样的
如何配置 sphinx 以记录供 MicroPython 解释器使用的模块? 我面临的根本问题是 sphinx 从导入的模块中获取它记录的信息。因此,用于记录模块的 python 解释器必须可导入到那
我正在尝试使用 micropython 在 esp32 上设置安全套接字服务器。我使用/尝试了带有自签名证书的最新版本(esp32-idf3-20200117-v1.12-68-g3032ae115.
我正在尝试使用对 STM32F407VE 的以太网支持构建自定义 Micropython 固件。我在没有以太网支持的情况下 fork 了工作板,并尝试使用以太网支持对其进行修改。 我做过的事情: 定义
我是一名优秀的程序员,十分优秀!