Python vs Cpython

时间:2013-06-16 07:00:18

标签: python cpython

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

10 个答案:

答案 0 :(得分:571)

那么什么是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解释器的代码。

答案 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是如何彼此不同的。

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

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

    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语言编写的。

Other list of Python Implementations

Source

答案 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 中编写类似的代码区别是:

    • Cython 允许我们编写可选的附加 C 代码和,
    • 在 Cython 中,我们的 python 代码在内部被翻译成 C 代码,以便它可以被 C 编译器编译。尽管 Cython 可以显着更快地执行,但仍达不到原始 C 语言的执行速度。这是因为 Cython 必须调用 CPython 解释器和 CPython 标准库来执行,因为它依赖它们来理解编写的 CPython 代码
  • JPython / Jython - python 的 Java 实现 编程语言。它是用Java和python编写的。这里我们的python代码首先被编译成Java字节码然后字节码被JVM解释或Java虚拟机

  • PyPy - python 的 RPython 实现 编程语言。它是用 Python 的一个受限子集编写的,称为受限 Python (RPython)PyPy 比 CPython 运行得更快因为为了解释字节码,PyPy 有一个即时编译器,而 CPython 有一个解释器。 PyPy 旨在为生成动态语言的实现提供一个通用的翻译和支持框架,其中语言规范和实现之间将有明确的分离。

    • 编译器将我们的高级源代码翻译成字节码将字节码翻译成机器码,有些实现有普通的解释器,有些有即时编译器。为了执行一个循环,比如说,百万次,JIT 编译器只将字节码转换为机器码一次,而在下一次迭代中,机器只会理解字节码。而普通解释器,在每次迭代中,反复将字节码翻译成机器码,从而需要更多时间来完成一个循环,比如百万次< /li>
  • 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