首页 > 编程语言 >CPython, Pypy, MicroPython...还在傻傻分不清楚?

CPython, Pypy, MicroPython...还在傻傻分不清楚?

时间:2023-07-06 19:11:21浏览次数:33  
标签:MicroPython Java CPython ... Python self python Pypy

哈喽大家好,我是咸鱼

当我们说 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 等

标签:MicroPython,Java,CPython,...,Python,self,python,Pypy
From: https://www.cnblogs.com/edisonfish/p/17533100.html

相关文章

  • 软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试
    在软件测试的过程中,多多少少都是会接触到一些测试工具,作为辅助测试用的,以提高测试工作的效率,使用好了测试工具,能对测试起到一个很好的作用,同时,有些公司,也会要求掌握一些测试工具,或者,是在面试时,也会被问到测试工具的,比如,在面试时,最常见的问题便是,你在测试时,用的是什么测试工具?或者......
  • 不确定传参的个数n=(1,2,...) 返回n*n的和
    #函数不确定的参数情况下输出n*n的和defcalc(numbers):total=0forninnumbers:print(f'n:{n}')total=total+n*nprint(f'total:{total}')returntotal#调用函数result=calc((1,2))print(f'result:{result}')......
  • .NET各种常见后缀名的含义(.csproj,.suo,.resx......)
    https://blog.csdn.net/prefercent/article/details/8471816整理了一些.NET项目中经常接触但是不明白什么意义的文件后缀名,希望能帮到大家。.cs类文件。源代码都写在这里,主要就看这里的代码。.Designer.cs设计文件,自动生成.resx资源文件,一些资源存放在这里.csprojC#项目文件......
  • restful api报错:Ambiguous handler methods mapped for ...
    问题最近,为了给大家搭建一个学习环境,开发了几个restfulapi  在用jmeter发请求的时候报错请求为: 报错:通过id查询,也会匹配到通过username查询{"code":1002,"msg":"请求失败","data":"Ambiguoushandlermethodsmappedfor'/qzcsbj/v2/users/4':{publiccom.qzcsbj.dem......
  • js正则表达式replace中参数为$1、$2、...、$99、函数等用法以及常用的正则表达式
    js正则表达式replace中参数为$1、$2、...、$99、函数等用法以及常用的正则表达式原文链接:https://blog.csdn.net/sxww_zyt/article/details/130258920示例:时间格式进行转换显示。//202007011927122020-07-0119:27:12getdateString(datastr){letpattern=/(\d{......
  • 【本周特惠课程】深度学习6大模型部署场景(Pytorch+NCNN+MNN+Tengine+TensorRT+微信小
    前言欢迎大家关注有三AI的视频课程系列,我们的视频课程系列共分为5层境界,内容和学习路线图如下:第1层:掌握学习算法必要的预备知识,包括Python编程,深度学习基础,数据使用,框架使用。第2层:掌握CV算法最底层的能力,包括模型设计基础,图像分类,模型分析。第3层:掌握CV算法最核心的方向,包括图像分......
  • 【C++】关于常引用的问题 #什么是权限放大?权限放小?隐式或强制转换居然还有这一步?...#
    前言引用在c++中的使用非常常见,可以说是很重要的,引用的常引用相关的问题让很多人稍不留神就出错了,这里我们就来谈谈常引用的问题。关于权限关于权限有权限缩小和权限放大的问题,比如一个文件,当初它只有读的权限,而现在你给它再加个写的权限,这就是权限放大;又或当初它读,写的权限......
  • 直播软件开发,TextView内容过多,超过n行显示“...全文”
    直播软件开发,TextView内容过多,超过n行显示“...全文” /**   *TextView超过两行,末尾显示"...全文"   *为避免抖动,需在xml中设置TextView的maxHeight   *@parammaxLine最多几行   *@paramstrNum 末尾显示字符数   *@paramstr 末尾显示字......
  • 展开语法和剩余语法(剩余参数)都是三个点...
    展开语法(Spreadsyntax),可以在函数调用/数组构造时,将数组表达式或者string在语法层面展开;还可以在构造字面量对象时,将对象表达式按key-value的方式展开;剩余参数语法允许我们将一个不定数量的参数表示为一个数组。区别是展开语法是把一个变量展开,剩余参数是一个参数用来代......
  • ERROR 3529 (HY000): Cannot load component from specified URN....
    这里介绍、演示一下,安装validate_password组件时遇到ERROR3529(HY000):CannotloadcomponentfromspecifiedURN:'file://component_validate_password'错误的原因当前测试的环境为MySQL8.0.33mysql> select @@version;+-----------+| @@version |+-----------+| 8.......