567

Python 和 CPython (Jython,IronPython)有什么大惊小怪的,我不明白:

python.org提到 CPython 是:

Python 的“传统”实现(绰号 CPython)

另一个 Stack Overflow 问题提到:

CPython 是 Python 的默认字节码解释器,它是用 C 编写的。

老实说,我不明白这两种解释的实际含义,但我认为,如果我使用 CPython,这是否意味着当我运行示例 python 代码时,它会将其编译为 C 语言,然后像 C 一样执行它代码

那么 CPython 到底是什么,与 python 相比它有什么不同,我应该在 Python 上使用 CPython,如果是,它的优势是什么?

4

10 回答 10

848

那么什么是CPython?

CPython 是最初的Python 实现。它是您从 Python.org 下载的实现。人们称它为 CPython 是为了将其与其他后来的 Python 实现区分开来,并将语言引擎的实现与 Python编程语言本身区分开来。

后一部分是您的困惑的来源;您需要将 Python 语言与运行Python 代码的任何内容分开。

CPython恰好是用 C 实现的。这只是一个实现细节,真的。CPython 将您的 Python 代码(透明地)编译成字节码,并在评估循环中解释该字节码。

CPython 也是第一个实现新特性的;Python 语言开发使用 CPython 作为基础;其他实现如下。

Jython 等呢?

JythonIronPythonPyPy是 Python 编程语言的当前“其他”实现;它们分别在 Java、C# 和 RPython(Python 的一个子集)中实现。Jython 将您的 Python 代码编译为Java字节码,因此您的 Python 代码可以在 JVM 上运行。IronPython 允许您在Microsoft CLR上运行 Python 。PyPy 是在 Python(的一个子集)中实现的,它可以让您比 CPython 更快地运行 Python 代码,这应该会让您大吃一惊。:-)

实际上编译为C

因此,CPython 本身不会将您的 Python 代码转换为 C。相反,它运行一个解释器循环。有一个项目可以Python-ish 代码翻译成 C,名为Cython。Cython 为 Python 语言添加了一些扩展,并允许您将代码编译为 C 扩展,即插入CPython解释器的代码。

于 2013-06-16T07:02:38.503 回答
118

您需要区分语言和实现。Python是一门语言,

根据Wikipedia的说法,“编程语言是用于编写程序的符号,是计算或算法的规范”。这意味着它只是编写代码的规则和语法。另外,我们有一个编程语言实现,在大多数情况下,它是实际的解释器或编译器。

Python是一种语言。CPython 是 Python 在 C 中的实现。Jython 是 Java 中的实现,依此类推。

总结一下:您已经在使用 CPython(如果您从此处下载)。

于 2013-06-16T07:07:24.023 回答
57

即使我在理解 CPython、JPython、IronPython、PyPy 之间有何不同时也遇到了同样的问题。

所以,在我开始解释之前,我愿意澄清三件事:

  1. Python:它是一种语言,它只说明/描述如何向解释器(接受您的 Python 代码的程序)传达/表达自己。
  2. 实施:这完全是关于解释器是如何编写的,特别是用什么语言以及它最终会做什么
  3. 字节码:它是由程序处理的代码,通常被称为虚拟机,而不是由“真正的”计算机机器,硬件处理器。

CPython 是用 C 语言编写的实现。它最终生成特定于 Python 的字节码(基于堆栈机器的指令集),然后执行它。将 Python 代码转换为字节码的原因是,如果解释器看起来像机器指令,则它更容易实现。但是,没有必要在执行 Python 代码之前生成一些字节码(但 CPython 确实会生成)。

如果您想查看 CPython 的字节码,那么您可以。您可以这样做:

>>> def f(x, y):                # line 1
...    print("Hello")           # line 2
...    if x:                    # line 3
...       y += x                # line 4
...    print(x, y)              # line 5
...    return x+y               # line 6
...                             # line 7
>>> import dis                  # line 8
>>> dis.dis(f)                  # line 9
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello')
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_FAST                0 (x)
             10 POP_JUMP_IF_FALSE       20

  4          12 LOAD_FAST                1 (y)
             14 LOAD_FAST                0 (x)
             16 INPLACE_ADD
             18 STORE_FAST               1 (y)

  5     >>   20 LOAD_GLOBAL              0 (print)
             22 LOAD_FAST                0 (x)
             24 LOAD_FAST                1 (y)
             26 CALL_FUNCTION            2
             28 POP_TOP

  6          30 LOAD_FAST                0 (x)
             32 LOAD_FAST                1 (y)
             34 BINARY_ADD
36 RETURN_VALUE

现在,让我们看看上面的代码。第 1 到 6 行是函数定义。在第 8 行,我们导入了“dis”模块,该模块可用于查看由 CPython(解释器)生成的中间 Python 字节码(或者你可以说,Python 字节码的反汇编程序)。

注意:我从#python IRC 频道获得了此代码的链接:https ://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

然后是 Jython,它是用 Java 编写的,最终生成 Java 字节码。Java 字节码在 Java 运行时环境中运行,它是 Java 虚拟机 (JVM) 的一种实现。如果这令人困惑,那么我怀疑您不知道 Java 是如何工作的。通俗地说,Java(语言,而不是编译器)代码由 Java 编译器获取并输出一个文件(即 Java 字节码),该文件只能使用 JRE 运行。这样做是为了,一旦 Java 代码被编译,就可以以 Java 字节码格式移植到其他机器上,该格式只能由 JRE 运行。如果这仍然令人困惑,那么您可能想看看这个网页

在这里,您可能会问 CPython 的字节码是否像 Jython 一样可移植,我怀疑不是。在 CPython 实现中生成的字节码是特定于该解释器的,以便于进一步执行代码(我也怀疑,这种中间字节码生成只是为了便于在许多其他解释器中完成处理)。

因此,在 Jython 中,当您编译 Python 代码时,您最终会得到可以在 JVM 上运行的 Java 字节码。

同样,IronPython(用 C# 语言编写)将您的 Python 代码编译为公共语言运行时 (CLR),这是一种与 JVM 类似的技术,由 Microsoft 开发。

于 2016-11-17T23:11:28.447 回答
35

这篇文章彻底解释了 Python 的不同实现之间的区别。正如文章所说:

首先要意识到“Python”是一个接口。有一个关于 Python 应该做什么以及它应该如何表现的规范(与任何接口一样)。并且有多种实现(与任何接口一样)。

要意识到的第二件事是“解释”和“编译”是实现的属性,而不是接口。

于 2014-02-20T17:25:00.987 回答
28

Python 是一种语言:一组可用于编写程序的规则。这种语言有几种实现。

无论你采用什么实现,它们都做几乎相同的事情:获取程序的文本并解释它,执行它的指令。他们都没有将您的代码编译成 C 或任何其他语言。

CPython 是用 C 编写的原始实现。(“CPython”中的“C”部分是指用于编写 Python 解释器本身的语言。)

Jython 是同一种语言 (Python),但使用 Java 实现。

IronPython 解释器是用 C# 编写的。

还有 PyPy - 一个用 Python 编写的 Python 解释器。做你的选择:)

于 2013-06-16T07:06:24.630 回答
18

由于python 是开源的,这就是为什么我们可以根据我们的要求自定义 python。自定义后,我们可以根据需要命名该版本。这就是为什么有多种 python 版本可用的原因。每种风味都是 python 的定制版本,以满足特殊要求。这类似于有多种 UNIX 风格的事实,如 Ubuntu、Linux、RedHat Linux 等。以下是 python 的一些风格:

  • CPython-我们从python.org下载的python编程语言的默认实现,由python软件基金会提供。它是用 C 和 python 编写的。它不允许我们编写任何 C 代码,只允许使用 python 代码。CPython 可以称为解释器和编译器,因为这里我们的python 代码首先被编译为 python 字节码,然后字节码被 PVM 或 Python 虚拟机解释为机器码

只有 JavaScript 是一种完全解释型语言,因为 JavaScript 源代码直接被逐行解释为机器码,不涉及字节码。JavaScript 引擎可以实现为标准解释器或即时编译器,如 Google Chrome 的 V8 引擎,不涉及字节码,但根据诸如一段代码的执行频率等决定存储已编译的机器代码。

在此处输入图像描述

  • Cython- Cython 是一种编程语言,它是 python 和 C 的超集。它是用 C 和 python 编写的。它旨在通过 python 语法和可选的 C-syntax 提供类似 C 的性能。Cython 是一种编译语言,因为它生成 C 代码并由 C 编译器编译。我们可以在 Cython 中编写与默认 python 或 CPython 类似的代码不同之处在于:
    • Cython 允许我们编写可选的附加 C 代码,并且,
    • 在 Cython中,我们的python 代码在内部被翻译成 C 代码,以便它可以被 C 编译器编译。尽管 Cython 的执行速度要快得多,但与原始的 C语言执行相比却有所不足。这是因为 Cython 必须调用 CPython 解释器和 CPython 标准库才能理解编写的 CPython 代码

在此处输入图像描述

  • JPython / Jython- python编程语言的Java实现。它是用 Java 和 python 编写的。在这里,我们的python 代码首先被编译为 Java 字节码,然后该字节码被 JVM或 Java 虚拟机解释为机器码。这类似于 Java 代码的执行方式:Java 代码首先被编译为中间字节码,然后字节码被 JVM 解释为机器码

  • PyPy- Python编程语言的 RPython 实现。它是用 Python 的一个受限子集编写的,称为 Restricted Python (RPython)PyPy 比 CPython 运行得更快,因为为了解释字节码,PyPy 有一个即时编译器,而 CPython 有一个解释器

在此处输入图像描述

编译器将我们的高级源代码翻译成字节码并将字节码翻译成机器码,一些实现有普通的解释器,一些有即时编译器。为了执行一个循环,比如说,百万次,JIT 编译器只将字节码转换为机器码一次,并且对于下一次迭代,机器只理解字节码JIT Compiler 根据诸如一段代码的执行频率等决定存储已编译的机器代码,因此它不必每次都将字节码转换为机器代码。JIT 编译器的缺点是在分析代码时初始执行速度较慢。而普通的解释器,在每次迭代中,重复地将字节码转换为机器码,从而花费更多时间来完成一个循环,例如,百万次

  • IronPython- python 的 C# 实现,针对 .NET 框架

  • Ruby Python- 适用于 Ruby 平台

  • Anaconda Python-分发用于科学计算的 python 和 R 编程语言,数据科学、机器学习、人工智能、深度学习、处理大量数据等。大量的库,如 scikit-learn、tensorflow、pytorch、numba、pandas、 jupyter、numpy、matplotlib 等可通过此软件包获得

  • Stackless-用于并发的 Python

为了测试每个实现的速度,我们编写了一个程序来调用integrate_f 500 次,使用N 值为50,000,并记录几次运行的执行时间。下表显示了基准测试结果:

执行 执行时间(秒) 加速
CPython 9.25
CPython + Cython 0.21 44x
派皮 0.57 16倍
于 2021-06-10T05:32:38.850 回答
10

implementation表示使用什么语言来实现 Python,而不是如何实现 Python 代码。使用 CPython 的优势在于 C 运行时的可用性以及与 C/C++ 的轻松集成。

所以 CPython 最初是使用C. 原始实现还有其他分支,使 Python 能够利用边缘 Java (JYthon) 或 .NET Runtime (IronPython)。

根据您使用的实现,库的可用性可能会有所不同,例如Ctypes 在 Jython 中不可用,因此任何使用 ctypes 的库都无法在 Jython 中运行。同样,如果你想使用 Java 类,你不能直接从 CPython 中这样做。您要么需要胶水 (JEPP),要么需要使用 Jython(Python 的 Java 实现)

于 2013-06-16T07:05:31.667 回答
8

您应该知道,由于Global Interpreter Lock,CPython 并不真正支持多线程(它确实支持,但不是最佳的)。它也没有递归优化机制,并且有许多其他实现和库试图填补的其他限制。

您应该查看python wiki 上的此页面。

查看页面上的代码片段,它会让您很好地了解解释器是什么。

于 2014-01-01T21:11:05.810 回答
2

当您想将其与其他选项进行对比时,通常会调用Python的原始和标准实现(否则只是简单的“Python”)。这个名字来源于它是用可移植的。这是您从http://www.python.org获取的 Python,通过ActivePythonEnthought发行版获得,并且在大多数 Linux 和 Mac OS X 机器上自动安装。如果你在你的机器上找到了一个预装的 Python 版本,它可能是 ,除非你的公司或组织正在以更专业的方式使用 Python。CPythonANSI C language codeCPython

除非您想使用 Python 编写脚本Java.NET应用程序,或者发现 Python 的好处StacklessPyPy引人注目,否则您可能希望使用标准CPython系统。因为它是该语言的参考实现,所以它往往比其他系统运行得最快、最完整、更新和健壮。

于 2018-01-04T06:15:59.587 回答
1

编程语言实现是用于执行计算机程序的系统。

编程语言实现有两种通用方法:

  • 解释:解释器将某种语言的程序作为输入,并在某台机器上执行用该语言编写的动作。
  • 编译:编译器将某种语言的程序作为输入,并将该程序翻译成其他语言,这可以作为另一个解释器或另一个编译器的输入。

Python是一种解释型高级编程语言,由Guido van Rossum于 1991 年创建。

CPython是 Python 计算语言的参考版本,它也是用Guido van Rossum创建的 C 语言编写的。

Python 实现的其他列表

资源

于 2018-08-24T03:08:04.753 回答