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

2023-07-06 21:01:12

哈嘍大家好,我是鹹魚

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