Python vs Cpython

关于Python和cpython# EYZ0有什么大惊小怪的,我不明白:

python.org提到CPython是:

Python的“传统”实现(昵称为CPython)

又是一个堆栈溢出问题提到:

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

老实说,我不明白这两个解释实际上意味着什么,但我想的是,如果我使用CPython,这是否意味着当我运行一个示例python代码时,它会将其编译为C语言,然后像执行C代码一样执行

那么到底什么是CPython,它与python相比有什么不同,我应该使用CPython而不是python,如果是的话,它的优点是什么?

303244 次浏览

那么什么是CPython呢?

CPython是原始 Python实现。它是你从Python.org下载的实现。人们称它为CPython是为了将它与后来的其他Python实现区分开来,并将语言引擎的实现与python# EYZ1本身区分开来。

后一部分是你困惑的来源;你需要将Python语言与任何运行的Python代码分开。

CPython 发生将用c实现,这只是一个实现细节,真的。CPython将Python代码编译为字节码(透明地),并在计算循环中解释该字节码。

CPython也是第一个实现新特性的;python语言开发以CPython为基础;接下来是其他实现。

Jython等等呢?

JythonIronPythonPyPy是当前的“其他”;Python编程语言的实现;它们分别用Java、c#和RPython (Python的一个子集)实现。Jython将您的Python代码编译为Java字节码,因此您的Python代码可以在JVM上运行。IronPython允许您在微软CLR上运行Python。而PyPy,是在Python(子集)中实现的,可以让你比CPython更快地运行Python代码,这应该会让你大吃一惊。:-)

实际上是编译成C语言

所以CPython 会自行将Python代码转换为C语言。相反,它运行解释器循环。有一个将python代码翻译成C语言的项目,叫做EYZ3。Cython为Python语言添加了一些扩展,并允许您将代码编译为C扩展,即插入CPython解释器的代码。

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

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

不管你采用什么实现,它们做的事情几乎是一样的:获取程序的文本并解释它,执行它的指令。它们都不会将您的代码编译成C或任何其他语言。

CPython是最初的实现,用C语言编写(“CPython”中的“C”部分指的是用来编写Python解释器本身的语言)。

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

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

还有PyPy——一个用Python编写的Python解释器。你自己选吧。

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

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

Python是一种语言。 CPython是Python在c语言中的实现,Jython是Java语言中的实现,等等。< / p >

总之:你已经在使用CPython了(如果你是从在这里下载的)。

你应该知道CPython并不真正支持多线程(它支持,但不是最优的),因为全局解释器锁。它也没有递归的优化机制,并且有许多其他实现和库试图填补的限制。

你应该看看python wiki上的这个页面

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

这个文章完全解释了Python的不同实现之间的区别。就像这篇文章说的:

首先要意识到的是' Python '是一个接口。有一个 Python应该做什么以及它应该如何表现(如 任何接口)。并且有多种实现(如 任何接口)。< / p > 要意识到的第二件事是' explained '和' compiled '是 实现的属性,而不是接口的属性

甚至我也有同样的问题,理解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),这是一种类似于JVM的技术,由微软开发。

Python的原始和标准实现通常被称为CPython 你想要对比它与其他选项(否则就是简单的“Python”)。这 名称来自于它是在可移植的ANSI C language code中编码的事实。这是 你从http://www.python.org中获取的Python,使用ActivePythonEnthought发行版,并在大多数Linux和Mac OS X机器上自动安装。 如果在您的机器上发现了预先安装的Python版本,那么它可能是 CPython,除非你的公司或组织在更专业的领域使用Python 方式。< / p >

除非你想用Python编写Java.NET应用程序的脚本,或者找到它们的好处 如果你觉得StacklessPyPy很吸引人,你可能想使用标准的CPython系统。 因为它是该语言的参考实现,所以它倾向于运行 最快、最完整、比替代方案更新更及时、更健壮 系统。< / p >

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

编程语言实现有两种一般方法:

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

Python是一种解释性高级编程语言,由Guido van Rossum在1991年创建。

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

其他Python实现列表

Source .

# EYZ0。自定义之后,我们可以根据需要命名该版本。这就是为什么python有多种口味。每种口味都是python的定制版本,以满足特殊要求。这类似于UNIX有多种版本,比如Ubuntu、Linux、RedHat Linux等等。以下是python的一些风味:

# EYZ0

python的默认实现编程语言,我们从python.org下载,由python软件基金会提供。它是用C和python编写。它不允许我们写任何C代码,只有python代码是允许的。CPython可以被称为一个解释器和一个编译器,这里是Python代码首先被编译为Python字节码,然后是字节码被PVM或Python虚拟机解释为特定于平台的操作。请记住,解释器有预定义的语言语法,这就是为什么它不需要翻译成低级机器代码。这里,Interpreter只是在运行时动态执行字节码,并导致特定于平台的操作。

code execution in cpython

JavaScript、Ruby和Php的旧版本都是完全解释的语言,因为它们的解释器将直接将每行源代码转换为特定于平台的操作,不涉及字节码。字节码存在于Java, Python, c++ (.net), c#中,以将语言与执行环境分离,即为了可移植性,编写一次,随处运行。自2008年以来,谷歌Chrome的V8 JavaScript引擎为JavaScript提供了Just-In-Time编译器。它像解释器一样逐行执行JavaScript代码以减少启动时间,但如果遇到重复执行一行代码的热段,则使用基线或优化编译器优化该代码。

# EYZ0

Cython是它是python和C语言的超集。它是用C和python编写。它被设计成类似c的性能,python语法和可选c语法。Cython是编译语言,因为它生成C代码并由C编译器编译。我们可以写在Cython中类似于默认python或CPython中的代码差异是:

  • Cython允许我们写可选附加C代码和,
  • 在Cython,我们的python代码会在内部转换成C代码,这样它就可以被C编译器编译。尽管Cython会导致相当多的更快的执行速度,但不如原来的C语言执行。这是因为Cython必须调用CPython解释器和CPython标准库来理解编写的CPython代码

enter image description here

# EYZ0

python的Java实现编程语言。它是用Java和python编写。这里是python代码首先被编译成Java字节码字节码被JVM解释为特定于平台的操作或Java虚拟机。这类似于Java代码的执行方式:Java代码首先被编译为中间字节码,然后由JVM将该字节码解释为特定于平台的操作

# EYZ0

python的RPython实现编程语言。它是用受限制的python子集编写,称为restricted python (RPython)PyPy比CPython运行得快因为为了解释字节码,PyPy有一个即时编译器(解释器+编译器),而CPython有一个解释器。因此,PyPy中的JIT Compiler可以像解释器一样逐行执行Python字节码,以减少启动时间,但如果遇到重复执行一行代码的热段,则使用Baseline or Optimizing Compiler优化该代码。

pypy代码执行

简要介绍JIT编译器: Python中的编译器将高级源代码转换为字节码来执行字节码,一些实现有普通的解释器,一些有即时编译器。要执行一个循环,例如,运行百万次,即非常热的代码,最初解释器将运行它一段时间,JIT编译器的Monitor将监视这段代码。然后,当它重复了一些次,即代码变得温暖*,然后JIT编译器将根据Monitor在监视代码时收集的数据,将该代码发送到Baseline Compiler会做一些假设变量类型等。在下一个迭代中,如果假设被证明是有效的,那么不需要将字节码重新转换为机器代码,即可以跳过步骤以更快地执行。如果代码重复很多次,即Baseline Compiler0,那么JIT编译器将发送该代码到Optimizing Compiler,这将使Baseline Compiler1,并将跳过更多步骤,快速执行。

当代码被分析时,JIT编译器缺陷: 初始执行速度较慢,如果假设被证明是错误的,则优化的编译代码被抛出,即DeoptimizationBailing out,而能使代码执行变慢吗,尽管JIT编译器有优化/反优化周期的限制。在发生一定数量的反优化之后,JIT Compiler就不再尝试优化了。而正常翻译每一次迭代Bailing out0因此需要更多的时间来完成一个循环,运行一百万次

# EYZ0

python的c#实现,针对。net框架

# EYZ0

支持Ruby平台

# EYZ0

用于科学计算的python和R编程语言的分布喜欢,数据科学,机器学习,人工智能,深度学习,处理大量数据等等。许多数量的像scikit-learn, tensorflow, pytorch, numba, pandas, jupyter, numpy, matplotlib等库。可与此包

# EYZ0

Python for并发

为了测试每个实现的速度,我们编写了一个程序,使用N值50,000调用integrate_f 500次,并记录几次运行的执行时间。下表显示了基准测试结果:

实现 执行时间(秒) 加快
CPython的 9.25
CPython + Cython 0.21 44 x
PyPy 0.57 16 x

Cpython是Python的默认实现,当我们从它的官方网站下载Python时,它就会出现在我们的系统中。

Cpython将扩展名为.py的python源代码文件编译为一个中间字节码,该字节码通常被赋予.pyc扩展名,并由Cpython虚拟机执行。Python的这种实现提供了与Python包和C扩展模块的最大兼容性。

还有许多其他的Python实现,如IronPython, Jython, PyPy, CPython, Stackless Python等等。