Python与Cpython


447

关于Python和CPython (Jython,IronPython)的所有这些大惊小怪,我不明白:

python.org提到CPython是:

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

另一个堆栈溢出问题提到:

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

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

那么CPython到底是什么?与python相比,它有什么区别?我应该在Python上使用CPython吗?如果有,它的优点是什么?


Answers:


688

那么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上下的代码转换为C,而被称为用Cython。用Cython增加了一些扩展Python语言,并让您编译代码,以C扩展,代码插头 CPython的解释。


92
我认为值得一提的是,从理论上讲,可以使用任何实现来运行python脚本,并且运行脚本的结果应该相同。
DouglasMendizábal13年

3
实际上,根据您正在处理的项目,在多个实现上测试和分析Python代码可能是一个好主意。之前曾从事过Java + Jython项目的工作,由于开发人员尚未在此平台上对他们的库进行足够的测试,您可能会遇到很多惊喜。
rahmu 2013年

9
我要说“ PyPy比CPython更快”是有点危险。有一个很好的答案,这里恰恰是问题:stackoverflow.com/questions/18946662/...
最大莱斯克

对IronPython感到非常兴奋...直到我看到它仅支持Python2.x。
肖恩·安德森

@SeanAnderson:Jython也是如此(直到2015年,正式发行版只有2.5兼容,已经过时了9年;他们终于在2015年发行了2.7版,但仍然没有3.x发行的迹象)。
ShadowRanger

89

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

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

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

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


2
您应该阅读Martijn Pieters的文章“ CPython本身不会将Python代码转换为C。而是运行解释器循环。有一个项目确实将Python式代码转换为C,并且称为Cython”
Raymond舍农2017年

2
为什么对Cpython的关注如此之多。即:我们听不到Cc ++,CJava甚至CSwift。还是我错过了什么?
Suhaib

3
@Suhaib:他们确实如此,在Java世界中,人们有HotSpot,OpenJDK,IBM J9 JDK,Azul。它们通常更精确,即您不会真正看到“安装Java”,而是“安装兼容的Java 8 JDK,例如Oracle JDK 8”。在JavaScript世界中,您有node.js,V8等。您是“安装node.js”,而不是“安装JavaScript”,对吗?但是在Python世界中,通常只是说“安装Python 3.6”并完成操作,这是指语言规范,而不是特定的运行时。
亨迪·爱侣湾

37

甚至我在理解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(语言,而不是编译器)代码,并输出只能使用JRE运行的文件(Java字节码)。这样做的目的是,一旦编译了Java代码,就可以将其以Java字节代码格式移植到其他计算机上,该格式只能由JRE运行。如果仍然令人困惑,那么您可能想看看该网页

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

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

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


3
thx的详细解释!这意味着CPython负责将Python代码转换为Byte Code并将字节代码解释为机器代码吗?简而言之,CPython是编译器(用于Python到字节代码)和Python虚拟机(用于Byte代码到机器代码)?与.Net相比,有C#编译器可以将C#转换为MSIL,而CLR可以从MSIL转换为机器代码。
rahulaga_dev

30

文章详细地介绍了Python中的不同实现之间的区别。如文章所述:

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

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


20

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

不管您采用哪种实现,它们都差不多做同样的事情:获取程序的文本并解释它,执行其指令。它们都没有将您的代码编译为C或任何其他语言。

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

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

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

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


8

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

因此CPython最初是使用来实现的C。原始实现还有其他方面,使Python能够利用Java(JYthon)或.NET Runtime(IronPython)进行开发。

根据您使用的实现,库可用性可能会有所不同,例如Jython中不提供Ctypes,因此任何使用ctypes的库在Jython中均不起作用。同样,如果要使用Java类,则不能直接从CPython中使用。您需要胶水(JEPP)或需要使用Jython(Python的Java实现)


4

您应该知道,由于全局解释器锁,CPython并不真正支持多线程。它还没有用于递归的优化机制,并具有其他实现和库试图填补的许多其他限制。

您应该在python Wiki上查看此页面

查看页面上的代码片段,它将使您对解释器的含义有所了解。


17
CPython支持多线程,但是GIL使其难以利用多个内核或CPU。这与完全不支持多线程并不完全相同。
马丁·彼得斯

0

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

除非您想使用Python 编写脚本Java.NET应用程序,或者想从中受益StacklessPyPy引人注目,否则您可能要使用标准CPython系统。因为它是该语言的参考实现,所以与替代系统相比,它往往运行最快,最完整,并且更新和更健壮。


3
我的意思不是无礼,但是CPython绝对不是最快的。
Myles Hollowed

0

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

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

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

PythonGuido van Rossum在1991年创建的一种解释型高级编程语言。

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

其他Python实施清单

资源

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.