- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!