关于Python和CPython (Jython,IronPython)的所有这些大惊小怪,我不明白:
python.org提到CPython是:
Python的“传统”实现(昵称为CPython)
yet another Stack Overflow question提到:
CPython是Python的默认字节码解释器,用C语言编写。
老实说,我没有得到这两个解释实际上意味着什么,但我认为是,如果我使用CPython这意味着当我运行示例python代码时,它将其编译为C语言然后执行它好像是C代码
那么CPython到底是什么?与python相比它有何不同?我是否应该使用CPython而不是Python?如果有的话,它的优势是什么?
答案 0 :(得分:571)
CPython是原始的 Python实现。这是您从Python.org下载的实现。人们将其称为CPython,以区别于其他后来的Python实现,并区分语言引擎的实现与Python 编程语言本身。
后半部分是你的困惑所在;你需要将Python-the-language与运行 Python代码分开。
CPython 发生在C中实现。这只是一个实现细节,真的。 CPython将您的Python代码编译成字节码(透明地)并在评估循环中解释该字节码。
CPython也是第一个实现新功能的人; Python-the-language开发使用CPython作为基础;其他实现如下。
Jython,IronPython和PyPy是当前"其他" Python编程语言的实现;它们分别在Java,C#和RPython(Python的一个子集)中实现。 Jython将您的Python代码编译为 Java 字节码,因此您的Python代码可以在JVM上运行。 IronPython允许您在Microsoft CLR上运行Python。 PyPy是在Python的(子集)中实现的,它允许您比CPython更快地运行Python代码,这应该让您大吃一惊。 : - )
因此,CPython 不将您的Python代码单独转换为C.相反,它运行一个解释器循环。 是 项目 将Python-ish代码转换为C,并称为Cython。 Cython为Python语言添加了一些扩展,并允许您将代码编译为C扩展,即将插入 CPython解释器的代码。
答案 1 :(得分:70)
您需要区分语言和实现。 Python是一种语言,
根据Wikipedia,“编程语言是编写程序的符号,它是计算或算法的规范”。这意味着它只是编写代码的规则和语法。另外,我们有programming language implementation,在大多数情况下,它是实际的解释器或编译器。
Python是一种语言。 CPython是C中Python的实现.Jython是Java中的实现,依此类推。
总结一下:您已经在使用CPython(如果您是从here下载的)。
答案 2 :(得分:27)
这个article彻底解释了不同Python实现之间的区别。就像文章所说:
首先要意识到'Python'是一个界面。有个 规范Python应该做什么以及它应该如何表现(如 任何界面)。并且有多种实现(如同 任何界面)。
要意识到的第二件事是'解释'和'编译'是 实现的属性,而不是接口。
答案 3 :(得分:25)
即使我有同样的问题,了解CPython,JPython,IronPython,PyPy是如何彼此不同的。
所以,在我开始解释之前,我愿意清除三件事:
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 Runtime Environment上运行,Java Runtime Environment是Java虚拟机(JVM)的一种实现。如果这令人困惑,那么我怀疑你不知道Java是如何工作的。通俗地说,Java(语言,而不是编译器)代码由Java编译器获取并输出只能使用JRE运行的文件(Java字节代码)。这样做是为了一旦Java代码被编译,那么它就可以以Java字节代码格式移植到其他机器上,这只能由JRE运行。如果这仍然令人困惑,那么您可能需要查看此web page。
在这里,您可能会问CPython的字节码是否像Jython一样可移植,我怀疑不是。在CPython实现中生成的字节码特定于该解释器,以便于进一步执行代码(我还怀疑,这样的中间字节码生成,只是为了便于处理在许多其他口译)。
因此,在Jython中,当您编译Python代码时,最终会得到Java字节代码,可以在JVM上运行。
同样,IronPython(用C#语言编写)将Python代码编译为公共语言运行时(CLR),与微软开发的JVM相比,这是一种类似的技术。
答案 4 :(得分:19)
Python是一种语言:一组可用于编写程序的规则。这种语言有几种实现方式。
无论你采取什么样的实现,它们都做同样的事情:获取程序的文本并解释它,执行它的指令。他们都没有将您的代码编译成C语言或任何其他语言。
CPython是用C编写的原始实现。(“CPython”中的“C”部分指的是用于编写Python解释器本身的语言。)
Jython是相同的语言(Python),但是使用Java实现。
IronPython解释器是用C#编写的。
还有PyPy - 一个用Python编写的Python解释器。请选择:)
答案 5 :(得分:7)
implementation
表示用于实现Python的语言,而不是如何实现python Code。使用CPython的优点是C Run-time的可用性以及与C / C ++的轻松集成。
所以CPython最初是使用C
实现的。原始实现还有其他分支,使Python能够利用Java(JYthon)或.NET Runtime(IronPython)。
根据您使用的实现,库可用性可能会有所不同,例如Ctypes is not available in Jython,因此任何使用ctypes的库都无法在Jython中运行。同样,如果要使用Java类,则无法直接从CPython执行此操作。你需要一个胶水(JEPP)或者需要使用Jython(Python的Java实现)
答案 6 :(得分:2)
你应该知道,由于Global Interpreter Lock,CPython并不真正支持多线程。它也没有用于递归的优化机制,并且还有许多其他实现和库试图填充的其他限制。
您应该查看python wiki上的this page。
查看this页面上的代码段,它会让您对解释器的内容有所了解。
答案 7 :(得分:0)
Python 的原始和标准实现通常称为 CPython
你想把它与其他选项(和普通的“Python”否则)进行对比。这个
名称来源于它是以便携式 ANSI C language code
编码的。这是
您从http://www.python.org获取的Python,使用 ActivePython 和
Enthought 发行版,并自动在大多数Linux和Mac OS X计算机上运行。
如果您在计算机上找到了预安装的Python版本,可能就是这样
CPython
,除非您的公司或组织使用更专业的Python
方式。
除非您想使用Python编写
Java
或.NET
应用程序脚本或找到好处Stackless
或PyPy
令人信服,您可能希望使用标准的CPython
系统。 因为它是语言的参考实现,所以它往往会运行 最快,最完整,并且比替代品更新,更强大 系统
答案 8 :(得分:0)
编程语言实现是用于执行计算机程序的系统。
有两种通用的编程语言实现方法:
Python 是由 Guido van Rossum 在1991年创建的一种解释型高级编程语言。
CPython 是Python计算语言的参考版本,它也是由 Guido van Rossum 创建的C语言编写的。
答案 9 :(得分:0)
由于 python 是开源的,这就是为什么我们可以根据我们的要求自定义 python。自定义后,我们可以根据需要命名该版本。这就是为什么有多种 Python 版本可用的原因。每种风格都是 Python 的定制版本,以满足特殊要求。类似于 UNIX 有多种风格,例如 Ubuntu、Linux、RedHat Linux 等。以下是 Python 的一些风格:
CPython
- python 的默认实现 编程语言,我们从 python.org 下载,由 python 软件基金会提供。它是用 C 和 python 编写的。它不允许我们写任何C代码,只允许python代码。 CPython 可以被称为解释器和编译器,因为这里我们的python 代码首先被编译为 python 字节码然后字节码被 PVM 或 Python 虚拟机解释
Cython
- Cython 是一种编程语言,它是 Python 和 C 的超集。它是用 C 和 python 编写的。它旨在通过 python 语法和可选的 C 语法提供类似 C 的性能。 Cython 是一种编译语言,因为它生成 C 代码并由 C 编译器编译。我们可以在 Cython 和默认的 Python 或 CPython 中编写类似的代码,区别是:
JPython / Jython
- python 的 Java 实现 编程语言。它是用Java和python编写的。这里我们的python代码首先被编译成Java字节码然后字节码被JVM解释或Java虚拟机
PyPy
- python 的 RPython 实现 编程语言。它是用 Python 的一个受限子集编写的,称为受限 Python (RPython)。 PyPy 比 CPython 运行得更快因为为了解释字节码,PyPy 有一个即时编译器,而 CPython 有一个解释器。 PyPy 旨在为生成动态语言的实现提供一个通用的翻译和支持框架,其中语言规范和实现之间将有明确的分离。
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 调用了 500 次集成_f,并记录了多次运行的执行时间。下表显示了基准测试结果:
实施 | 执行时间(秒) | 加速 |
---|---|---|
CPython | 9.25 | |
CPython + Cython | 0.21 | 44x |
PyPy | 0.57 | 16x |