主頁 > 後端開發 > CPython, Pypy, MicroPython...還在傻傻分不清楚?

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

2023-07-07 07:40:54 後端開發

哈嘍大家好,我是咸魚

當我們說 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 等

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/556686.html

標籤:其他

上一篇:基數排序

下一篇:返回列表

標籤雲
其他(162129) Python(38266) JavaScript(25524) Java(18291) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7288) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4613) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) HtmlCss(1989) .NET技术(1985) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • CPython, Pypy, MicroPython...還在傻傻分不清楚?

    哈嘍大家好,我是咸魚 當我們說 Python 時,通常指的是官方實作的 CPython 但還有很多比如 Pypy、Jython、MicroPython、Brython、RustPython 等 “python” 許多小伙伴看到這些帶 “python” 的概念可能一頭霧水,心想這跟我平時接觸到的 py ......

    uj5u.com 2023-07-07 07:40:54 more
  • 基數排序

    最近又有個奇奇怪怪的題目,資料為 $n \le 1 \times 10^7$,并且還要用到排序,普通的排序肯定會超時,然后就發現了一種 $O(n)$ ## 介紹 基數排序(Radix Sort)是桶排序的擴展,它是將整數按位數切割成不同的數字,然后按每個數位分別比較以此來排序。 說詳細點,也就是將所 ......

    uj5u.com 2023-07-07 07:40:50 more
  • 基數排序

    ## 前言 基數排序是一種非常快且好寫的排序。 以前一直以為基數排序就是桶排,現在發現自己很智慧,警鐘長鳴。 # 思想 基數排序是一個以桶排為基礎的排序。 桶排我就不多說了,簡單且 $O(n)$。 但是桶排有一個弊端,就是由于考試時空間限制是 $10^8$ 左右,可需要排序的資料是 $10^9$ 的 ......

    uj5u.com 2023-07-07 07:40:46 more
  • 2023 年 7 個適合初學者的 Vue.js 教程

    這個精心挑選的串列將幫助 Vue 初學者找到七個很棒的資源來開始學習 Vue。 我相信你來這里是為了尋找一些資源來開始學習 Vue.js 框架的奇妙旅程,無論是作為第一個工具還是你熟悉的其他框架的附加工具。不管怎樣,你很幸運,因為這就是我們將在這篇文章中介紹的內容。 隨著現代 Web 應用程式對更多 ......

    uj5u.com 2023-07-07 07:40:41 more
  • Servlet p7 ServletContext物件

    # ServletContext物件 **每一個 web 應用都有且僅有一個 ServletContext 物件**,又稱為 Application 物件,從名稱中可知,該物件是與應用程式相關的。在WEB 容器啟動時,會為每一個 WEB 應用創建一個對應的 ServletContex物件。 **該對 ......

    uj5u.com 2023-07-07 07:40:03 more
  • 基數排序

    ## 前言 基數排序是一種非常快且好寫的排序。 以前一直以為基數排序就是桶排,現在發現自己很智慧,警鐘長鳴。 # 思想 基數排序是一個以桶排為基礎的排序。 桶排我就不多說了,簡單且 $O(n)$。 但是桶排有一個弊端,就是由于考試時空間限制是 $10^8$ 左右,可需要排序的資料是 $10^9$ 的 ......

    uj5u.com 2023-07-07 07:00:09 more
  • SSO2.0 20-20230705

    ......

    uj5u.com 2023-07-06 09:39:00 more
  • SSO2.0 20-20230705

    ......

    uj5u.com 2023-07-06 09:32:13 more
  • 對敏感操作的二次認證 —— 詳解 Sa-Token 二級認證

    ### 一、需求分析 在某些敏感操作下,我們需要對已登錄的會話進行二次驗證。 比如代碼托管平臺的倉庫洗掉操作,盡管我們已經登錄了賬號,當我們點擊 **[洗掉]** 按鈕時,還是需要再次輸入一遍密碼,這么做主要為了兩點: 1. 保證操作者是當前賬號本人。 2. 增加操作步驟,防止誤洗掉重要資料。 這就 ......

    uj5u.com 2023-07-05 09:12:40 more
  • 對敏感操作的二次認證 —— 詳解 Sa-Token 二級認證

    ### 一、需求分析 在某些敏感操作下,我們需要對已登錄的會話進行二次驗證。 比如代碼托管平臺的倉庫洗掉操作,盡管我們已經登錄了賬號,當我們點擊 **[洗掉]** 按鈕時,還是需要再次輸入一遍密碼,這么做主要為了兩點: 1. 保證操作者是當前賬號本人。 2. 增加操作步驟,防止誤洗掉重要資料。 這就 ......

    uj5u.com 2023-07-05 09:11:38 more