Python vs Cpython

问题描述 投票:350回答:10

什么是关于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,如果有的话,它的优点是什么?

python cpython
10个回答
588
投票

那么CPython是什么?

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

后半部分是你的困惑所在;你需要将Python-the-language与运行Python代码的任何东西分开。

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

CPython也是第一个实现新功能的人; Python-the-language开发使用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解释器的代码。


72
投票

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

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

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

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


27
投票

这个article彻底解释了Python的不同实现之间的区别。就像文章所说:

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

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


27
投票

即使我有同样的问题,了解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 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),与Microsoft开发的JVM相比,这是一种类似的技术。


19
投票

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

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

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

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

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

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


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实现)


2
投票

你应该知道,由于Global Interpreter Lock,CPython并不真正支持多线程。它也没有用于递归的优化机制,并且还有许多其他实现和库试图填充的其他限制。

你应该看看python wiki上的this page

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


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应用程序脚本或者发现StacklessPyPy引人注目的好处,否则你可能想要使用标准的CPython系统。因为它是该语言的参考实现,所以它往往运行速度最快,最完整,并且比替代系统更新,更强大。


0
投票

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

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

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

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

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

Other list of Python Implementations

Source

© www.soinside.com 2019 - 2024. All rights reserved.