CPython, Pypy, MicroPython...还在傻傻分不清楚?
哈喽大家好,我是咸鱼
当我们说 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 这门语言应该具备哪些语言要素,应当能完成什么样的任务
Python 语言规范可以用不同的方式实现,可以用 C 实现,也可以用 C++、Java、C#、JavaScript,甚至使用 Python 自己实现
python 最初是由龟哥(Guido van Rossum)用 C 编写的(CPython)
在 python 大获成功之后,许多其他的项目开始用其他的编程语言或者不同的目标去重新编写 python
那么这些项目中的每一个 python 实现都需要一个名字去区别于最初的那个 python(龟哥写的那个)
所以这就是 Pypy、MicroPython、Iron Python、Jython 和 Pyston 等丰富多彩的名字出现的原因
各种 "python" 介绍
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...还在傻傻分不清楚?的更多相关文章
- 2021年了,`IEnumerator`、`IEnumerable`还傻傻分不清楚?
IEnumerator.IEnumerable这两个接口单词相近.含义相关,傻傻分不清楚. 入行多年,一直没有系统性梳理这对李逵李鬼. 最近本人在怼着why神的<其实吧,LRU也就那么回事> ...
- cookie、session,、token,还在傻傻分不清?
摘要:session 和 token 本质上是没有区别的,都是对用户身份的认证机制,只是他们实现的校验机制不一样而已. 本文分享自华为云社区<Session/Cookie/Token 还傻傻分不 ...
- JS魔法堂:属性、特性,傻傻分不清楚
一.前言 或许你和我一样都曾经被下面的代码所困扰 var el = document.getElementById('dummy'); el.hello = "test"; con ...
- Java:接口和抽象类,傻傻分不清楚?
01. 来看网络上对接口的一番解释: 接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合.一个类通过继承接口的方式,从而来继承接口的抽象方法. 兄弟们,你们怎么 ...
- [转帖]十分钟快速理解DPI和PPI,不再傻傻分不清!
十分钟快速理解DPI和PPI,不再傻傻分不清! https://baijiahao.baidu.com/s?id=1605834796518990333&wfr=spider&for= ...
- 【华为敏捷/DevOps实践】7. 敏捷,DevOps,傻傻不分清楚【华为云技术分享】
文:姚冬(华为云DevCloud首席技术布道师,资深DevOps与精益/敏捷专家,金融解决方案技术Leader,中国DevOpsDays社区核心组织者) 前言 敏捷是什么?DevOps是什么?两者有什 ...
- 傻傻分不清之 Cookie、Session、Token、JWT
傻傻分不清之 Cookie.Session.Token.JWT 什么是认证(Authentication) 通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打 ...
- Shell中傻傻分不清楚的TOP3
Shell中傻傻分不清楚的TOP3 发布文章 近来小姐姐又犯憨憨错误,问组内小伙伴export命令不会持久化环境变量吗?反正我是问出口了..然后小伙伴就甩给了我一个<The Linux Comm ...
- URI与URL傻傻分不清楚?
前言 总所周知,缓存是解决Http1.1协议传输性能的问题中最主要的手段. 缓存既可以存在于浏览器上,也可以存在于服务器中. 而影响缓存的Http头部有很多,其中Cache-Control是比较重要的 ...
- 【jvm】08-垃圾回收器那么多傻傻分不清?
[jvm]08-垃圾回收器那么多傻傻分不清? 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点 ...
随机推荐
- 全网最详细中英文ChatGPT-GPT-4示例文档-食谱智能生成从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- SpringBoot @Target、@Retention、@Documented注解简介
jdk1.5起开始提供了4个元注解:@Target.@Retention.@Documented.@Inherited.何谓元注解?就是注解的注解. 在程序开发中,有时候我们需要自定义一个注解,这个自 ...
- MQTT-发布与订阅的报文
MQTT发布订阅流程 在MQTT发布/订阅模式中,一个客户端既可以是发布者,也可以是订阅者,也可以同时具备这两个身份.当客户端发布一条消息时,它会被发送到代理,然后代理将消息路由到该主题的所有订阅者. ...
- 【Lua】VSCode 搭建 Lua 开发环境
前言 最近在找工作,基本所有的岗位都会问到 Lua(甚至拼 UI 的都要求会 Lua),咱能怎么办呢,咱也只能学啊-- 工欲善其事,必先利其器.第一步,先来把环境配置好吧! 当前适用版本: LuaBi ...
- 数据分析04-pandas(apply函数、排序、数据合、分组聚合、透视表、交叉表及项目分析)
数据分析-04 排序 按标签(行)排序 按标签(列)排序 按某列值排序 数据合并 concat merge & join 分组聚合 分组 聚合 透视表与交叉表 透视表 交叉表 项目:分析影响学 ...
- 掌握这些GitHub搜索技巧,你的开发效率将翻倍!
作为开发it行业一员,学习借鉴他人项目是很有必要的,所以我们一般都会从github或者 Gitee 上面去参考借鉴他人的项目来学习增加自己的项目经验 但是github你真的用对了嘛,他的功能其实很强大 ...
- 今日分享:目前目标责任成本明细单价已设置,机构参数设置-物资合同单价超目标责任成本明细单价Y%时不能保存,该参数已设置但未生效是为什么?
在编制的时候-"材料类别设置"中,不勾选"管控".
- 想打印k8s资源YAML结果搞懂了Client-Side & Server-Side Apply
前言 由于查看k8s资源YAML时常看到沉长的YAML与手写的格式,相差甚远不利于阅读,经过探索官方文档,才理解什么是Client-Side & Server-Side Apply. 先看一下 ...
- 【Python基础】变量的作用域与global、nonlocal
在 Python 中,变量的作用域指的是变量可以被访问的范围.Python 中的变量作用域有两种: 局部作用域:变量在函数函数内部的时候,只能在函数内部使用.这样的变量被称为局部变量. 如果在函数内部 ...
- 【易车网实例】x-sign逆向保姆级教程
易车号x-sign逆向 前言 许多网站都有反爬机制,x-sign加密就是许多反爬虫机制的其中一种,本次将以易车号作为目标进行演示. 方法仅供学习参考. 链接:https://hao.yiche.com ...