为什么 C 代码比 Python 运行得更快?

pythonserver side programmingprogramming

在本文中,我们将了解为什么 C 语言代码比 Python 运行得更快。

Guido Van Rossum 开发了 Python,这是最著名的编程语言之一。Python 因其清晰的语法和简单的代码而受到开发人员的欢迎,即使是新手也是如此。学习 Python 对于刚刚开始编程生涯的人来说非常有利。他们可以使用 Python 编程培训、博客、视频、模块和数千种其他资源来了解这种流行语言的各个方面。完成后,您将能够进行现代开发活动,例如 GUI 开发、Web 设计、系统管理、复杂的金融交易或计算、数据科学、可视化等等。

Python 比 C 慢,因为它是一种解释型语言。

Python 比 C 慢,因为它是一种解释型语言。

因此,需要更多实际 CPU 指令来执行给定语句。

您可以通过将数字 1 添加到 Python 代码中或将其与给定值进行比较来验证变量的值,以查看它是否小于、大于或精确等于该值。

不同之处在于,Python 代码不是由 CPU 立即执行,而是将被解释。

就性能而言,这产生了天壤之别。

几乎总是使用虚拟机来运行 Python 代码

虚拟的另一个名称计算机是一个"字节码解释器"。

解释代码总是比实际的机器代码慢,因为执行一条指令需要的指令比执行一条实际的机器指令多得多。

示例

考虑表达式 x += 1。在英特尔 CPU 中,寄存器增量是一个延迟为 1 且倒数吞吐量为三分之一 (1/3) 的单个操作。

换句话说,它指的是英特尔处理器可以提供的最快的 CPU 指令。

在 Python 中,这个 x += 1 是如何实现的?

要理解这一点,您必须首先了解 Python 的内部工作原理。

Python 的内部组件包括标记器、词法分析器、字节码生成器和字节码解释器 −

  • Tokenizer - 它从给定的 ASCII 文本文件(Python 代码)创建标记流。

  • 词法分析器 - Python 的这个区域涉及适当的缩进和间距。语法检查发生在此时。

  • 字节码生成器 - 如果进行了任何优化,则由 Python 组件进行;但是,由于 Python 不是编译语言,因此与 C 编译器相比,可用的优化范围受到限制。

  • 称为"字节码解释器"的 Python 模块管理字节码流并为 Python 虚拟机提供支持(维护其状态)。

一旦生成,字节码通常会缓存在内存中。

由于您不必为 Python 已经见过的代码重复标记化、词法分析和字节码生成过程,因此这可以提高速度。

因此,我们不必在每次循环 while 循环时都经历标记化、词法分析和字节码创建过程,而只需继续将字节码传递给字节码解释器即可。

这不是更快吗?不,实际上不是。

虽然使用缓存的字节码更快,但它的执行或操作不如机器码快。

运行代码的真正 CPU 不是虚拟计算机。

编译过程

编译后的 UCSD Pascal 与当时的其他编译语言不同,并未编译为汇编语言。它被编译成 p-Code。

因此,当您想到"编译的 Pascal 程序"时,就会想到 p-Code。如果您喜欢 Java 或 Python,并想假装自己想出了新东西,请使用"字节码"。

此外,Python 包含"编译的 Python"概念,它指的是已由标记器、词法分析器和字节码生成器处理过的 Python 代码,以创建可提供给字节码解释器(又称 Python 虚拟机)的缓存字节码。

当您看到扩展名为 .py 的文件时,它是一个包含 Python 源代码的 ASCII 文本文件。

PYthon,编译是扩展名为".pyc"的文件所代表的。

虚拟计算机仍然执行创建的代码。

本机代码

一旦程序被构建,它就没有完全转换为本机代码,直到它被转换为其设计平台的本机二进制 CPU 指令。

而不是使用字节码,通常涉及编写汇编代码、将其传递给汇编程序,并让汇编程序创建特定于平台的目标文件。

在程序连接到平台运行时之前,它尚未准备好使用。运行时可以提供运行时服务,如动态对象加载,并构建代码将在其中执行的环境。在编译的 C 中,存在运行时。已编译的 C++ 有一个运行时。

为什么 Python 比 C 慢?

  • Python 执行大量的健全性检查 - 整数永远不会溢出,无效内存永远不会被访问,类型永远不会(悄无声息地)不正确,并且数组永远不会在其末尾写入或读取。在 Python 中,很难出现"非本地错误",但在 C 中,错误实际上不在报告错误的地方,这种情况相当常见。

  • Python 的编译器不会进行非常高级的优化(如果有的话)——首先,速度并不像在 C 中那么重要,而且没有那么多信息可供参考——例如,在 Common Lisp(另一种像 Python 这样的动态语言)中,您可以提供类型注释以获得与 C 相同的速度——如果您选择退出安全检查并承诺某些变量将具有某些类型,您将获得完全相同的机器代码指令(如果您的程序中有错误,则会获得完全相同的奇怪行为)。

结论

在本文中,我们了解了 C 语言代码执行速度比 Python 更快的不同原因。


相关文章