Python 与 Cpython 的比较
- 2025-02-28 08:23:00
- admin 原创
- 63
问题描述:
我不明白为什么 Python 和 CPython (Jython、IronPython)这么受关注:
python.org提到 CPython 是:
Python 的“传统”实现(昵称 CPython)
Stack Overflow 上还有一个问题提到:
CPython 是 Python 的默认字节码解释器,用 C 编写。
老实说,我不明白这两种解释实际上意味着什么,但我的想法是,如果我使用 CPython,这是否意味着当我运行示例 Python 代码时,它会将其编译为 C 语言,然后像执行 C 代码一样执行它
那么 CPython 到底是什么,它与 Python 相比有何不同,我是否应该使用 CPython 而不是 Python,如果是的话,它的优势是什么?
解决方案 1:
那么什么是 CPython?
CPython 是原始的Python 实现。它是您从 Python.org 下载的实现。人们将其称为 CPython,以将其与其他后来的 Python 实现区分开来,并将语言引擎的实现与 Python编程语言本身区分开来。
后一部分就是您感到困惑的地方;您需要将 Python 语言与运行Python 代码的任何内容分开。
CPython恰好是用 C 实现的。实际上,这只是一个实现细节。CPython 将您的 Python 代码编译为字节码(透明地),并在评估循环中解释该字节码。
CPython 也是第一个实现新功能的语言;Python 语言开发以 CPython 为基础;其他实现紧随其后。
Jython 等等怎么样?
Jython、IronPython和PyPy是 Python 编程语言当前的“其他”实现;它们分别用 Java、C# 和 RPython(Python 的一个子集)实现。Jython 将您的 Python 代码编译为Java字节码,因此您的 Python 代码可以在 JVM 上运行。IronPython 可让您在Microsoft CLR上运行 Python 。而 PyPy 是用 Python(的一个子集)实现的,可让您比 CPython 更快地运行 Python 代码,这理应让您大吃一惊。:-)
实际编译为 C
因此,CPython不会自行将您的 Python 代码转换为 C。相反,它会运行一个解释器循环。有一个项目确实会将Python 式代码转换为 C,它被称为Cython。Cython为 Python 语言添加了一些扩展,并允许您将代码编译为 C 扩展,即插入CPython解释器的代码。
解决方案 2:
你需要区分语言和实现。Python 是一种语言,
根据维基百科,“编程语言是编写程序的符号,是计算或算法的规范”。这意味着它只是编写代码的规则和语法。另外,我们有一个编程语言实现,在大多数情况下,它是实际的解释器或编译器。
Python 是一种语言。CPython 是 Python 用 C 语言实现的。Jython 是 Java 语言实现的,等等。
总结一下:您已经在使用 CPython(如果您从这里下载)。
解决方案 3:
我甚至在理解 CPython、JPython、IronPython 和 PyPy 彼此之间的区别时也遇到了同样的问题。
因此,在开始解释之前,我愿意先澄清三件事:
Python:它是一种语言,它只说明/描述如何向解释器(接受你的 Python 代码的程序)传达/表达你自己。
实现:这都是关于解释器是如何编写的,具体来说,使用什么语言编写,以及它最终做什么。
字节码:是由程序(通常称为虚拟机)而不是“真实的”计算机机器(硬件处理器)处理的代码。
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 Runtime Environment) 上运行,它是 Java 虚拟机 (JVM) 的一种实现。如果这让您感到困惑,那么我怀疑您根本不知道 Java 是如何工作的。通俗地说,Java 编译器获取 Java(语言,而不是编译器)代码并输出一个文件(Java 字节码),该文件只能使用 JRE 运行。这样做的目的是,一旦 Java 代码被编译,它就可以以 Java 字节码格式移植到其他机器上,而 Java 字节码格式只能由 JRE 运行。如果这仍然让您感到困惑,那么您可能需要查看此网页。
这里,你可能会问 CPython 的字节码是否像 Jython 一样可移植,我怀疑不是。CPython实现中生成的字节码特定于该解释器,以便于进一步执行代码(我还怀疑,许多其他解释器中也存在这种中间字节码生成,只是为了便于处理)。
因此,在 Jython 中,当您编译 Python 代码时,最终会得到可以在 JVM 上运行的 Java 字节码。
类似地,IronPython(用 C# 语言编写)将您的 Python 代码编译为公共语言运行时 (CLR),这是一种与 Microsoft 开发的 JVM 类似的技术。
解决方案 4:
由于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、Ruby、Php 是完全解释型语言,因为它们的解释器会直接将每一行源代码转换为特定于平台的操作,不涉及字节码。Java、Python、C++ (.net)、C# 中都有字节码,用于将语言与执行环境分离,即实现可移植性,一次编写,随处运行。自 2008 年以来,Google Chrome 的 V8 JavaScript 引擎推出了 JavaScript 的即时编译器。它像解释器一样逐行执行 JavaScript 代码以减少启动时间,但如果遇到重复执行代码行的热门部分,则使用基线或优化编译器优化该代码。
Cython
Cython 是一种编程语言,是 Python 和 C 的超集。它用 C 和 Python 编写。它旨在通过 Python 语法和可选的 C 语法提供类似 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
RPython 是 Python编程语言的实现。它是用 Python 的一个受限子集(称为受限 Python (RPython))编写的。PyPy的运行速度比 CPython 快,因为为了解释字节码,PyPy 有一个即时编译器(解释器 + 编译器),而 CPython 有一个解释器。因此,PyPy 中的 JIT 编译器可以像解释器一样逐行执行 Python 字节码以减少启动时间,但如果遇到重复执行代码行的热门部分,则使用优化该代码Baseline or Optimizing Compiler
。
JIT 编译器简介:Python 中的编译器将高级源代码转换为字节码,并且为了执行字节码,一些实现具有普通解释器,一些具有即时编译器。要执行运行数百万次的循环,即非常热门的代码,最初解释器将运行一段时间,而
Monitor
JIT 编译器将监视该代码。然后,当它重复几次时,即代码变得热,那么 JIT 编译器将把该代码发送到,该编译器将Baseline Compiler
根据监视代码时收集的数据对变量类型等做出一些假设。从下一次迭代开始,如果假设是正确的,则无需将字节码重新转换为机器码,即可以跳过一些步骤以加快执行速度。如果代码重复很多次,即代码变得非常热,那么 JIT 编译器将把该代码发送到,该编译器将做出更多假设*并跳过更多步骤以实现非常快速的执行。Monitor
`Optimizing Compiler`
JIT 编译器的缺点:代码分析时执行速度较慢,如果假设被证明是错误的,那么优化的编译代码将被丢弃*,
Deoptimization
或者Bailing out
发生这种情况,这会使代码执行速度变慢,尽管 JIT 编译器对优化/反优化周期有限制。在发生一定数量的反优化之后,JIT 编译器就不会再尝试优化了。而普通解释器在每次迭代中都会反复将字节码转换为机器码,*因此需要更多时间来完成运行数百万次的循环
IronPython
python 的 C# 实现,针对 .NET 框架
Ruby Python
与 Ruby 平台兼容
Anaconda Python
分发用于科学计算的 Python 和 R 编程语言,例如数据科学、机器学习、人工智能、深度学习、处理大量数据等。此软件包提供大量库,例如 scikit-learn、tensorflow、pytorch、numba、pandas、jupyter、numpy、matplotlib 等
Stackless
Python 并发
为了测试每个实现的速度,我们编写一个程序,使用 N 值 50,000 调用integrate_f 500 次,并记录多次运行的执行时间。下表显示了基准测试结果:
执行 | 执行时间(秒) | 加快 |
---|---|---|
CPython | 9.25 | |
CPython + Cython | 0.21 | 44x |
派派 | 0.57 | 16倍 |
解决方案 5:
本文彻底解释了Python不同实现之间的区别。正如文章所说:
首先要意识到的是,“Python” 是一个接口。Python 应该做什么以及它应该如何表现(与任何接口一样),有一个规范。并且有多种实现(与任何接口一样)。
要认识到的第二件事是“解释”和“编译”是实现的属性,而不是接口的属性。
解决方案 6:
Python 是一种语言:一组可用于编写程序的规则。该语言有多种实现。
不管你采用哪种实现,它们做的事情都差不多:获取程序文本并对其进行解释,执行其指令。它们都不会将代码编译成 C 或任何其他语言。
CPython 是最初的实现,用 C 语言编写。(“CPython”中的“C”部分指的是用于编写 Python 解释器本身的语言。)
Jython 是同一种语言(Python),但是使用 Java 实现。
IronPython 解释器是用 C# 编写的。
还有 PyPy - 一个用 Python 编写的 Python 解释器。请自行选择 :)
解决方案 7:
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 实现)
解决方案 8:
您应该知道,由于Global Interpreter Lock的存在,CPython 并不真正支持多线程(它确实支持,但不是最佳的)。它也没有针对递归的优化机制,并且还有许多其他实现和库试图填补的限制。
您应该看一下python wiki 上的这个页面。
查看此页面上的代码片段,它将让您很好地了解什么是解释器。
解决方案 9:
当您想将 Python 与其他选项进行对比时,通常会调用Python的原始和标准实现(否则,就直接使用“Python”)。这个名字源于它以可移植方式编码的事实。这是您从http://www.python.org获取的 Python ,随ActivePython和
Enthought发行版一起获取,并自动安装在大多数 Linux 和 Mac OS X 计算机上。如果您在计算机上发现了预安装的 Python 版本,则可能是
,除非您的公司或组织以更专业的方式使用 Python。CPython
ANSI C language code
CPython
除非您想用 Python 编写脚本
Java
或.NET
应用程序,或者发现其优点Stackless
或PyPy
吸引力,否则您可能希望使用标准CPython
系统。由于它是该语言的参考实现,因此它往往运行速度最快、最完整,并且比其他系统更先进、更强大。
解决方案 10:
编程语言实现是执行计算机程序的系统。
编程语言实现有两种通用方法:
解释:解释器将某种语言的程序作为输入,并在某些机器上执行用该语言编写的操作。
编译:编译器将某种语言的程序作为输入,然后将该程序翻译成其他语言,该语言可以作为另一个解释器或另一个编译器的输入。
Python是一种解释型高级编程语言,由Guido van Rossum于 1991 年创建。
CPython是Python计算语言的参考版本,也是由Guido van Rossum用C语言编写的。
其他 Python 实现列表
来源
解决方案 11:
Cpython 是 Python 的默认实现,也是我们从其官方网站下载 Python 时获取到的实现。
Cpython 将扩展名为 .py 的 Python 源代码文件编译为中间字节码(通常扩展名为 .pyc),并由 Cpython 虚拟机执行。Python 的这种实现与 Python 包和 C 扩展模块提供了最大程度的兼容性。
还有许多其他 Python 实现,例如 IronPython、Jython、PyPy、CPython、Stackless Python 等等。
扫码咨询,免费领取项目管理大礼包!