为什么 C 代码运行速度比 Python 快?
在本文中,我们将学习为什么 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 的内部组件包括标记器、词法分析器、字节码生成器和字节码解释器 -
标记器 - 它从给定的 ASCII 文本文件(Python 代码)创建标记流。
词法分析器 - Python 的这一部分关注适当的缩进和空格。语法检查在此处发生。
字节码生成器 - 如果进行任何优化,则由 Python 组件进行;但是,因为 Python 不是编译型语言,所以与从 C 编译器获得的优化范围相比,可用优化的范围受到限制。
称为“字节码解释器”的 Python 模块管理字节码流并为 Python 虚拟机提供动力(维护其状态)。
字节码生成后通常缓存在内存中。
因为您不必重复 Python 已经看到的代码的标记化、词法分析和字节码生成过程,所以这提高了速度。
因此,我们可以只将字节码传递给字节码解释器,而不必每次循环 while 循环时都经历标记化、词法分析和字节码生成过程。
这难道不更快吗? 实际上,并非如此。
虽然使用缓存的字节码更快,但它不会像机器代码那样快速执行或运行。
运行代码的真实 CPU 不是虚拟计算机。
编译过程
与当时的其他编译语言不同,编译后的 UCSD Pascal 并未编译成汇编语言。相反,它被编译成 p 代码。
因此,当您想到“编译的 Pascal 程序”时,就会想到 p 代码。如果您喜欢 Java 或 Python 并想假装自己想出了新东西,请使用“字节码”。
此外,Python 包含“编译的 Python”的概念,它指的是已由标记器、词法分析器和字节码生成器处理的 Python 代码,以创建准备提供给字节码解释器(也称为 Python 虚拟机)的缓存字节码。
当您看到扩展名为 .py 的文件时,它是一个包含 Python 源代码的 ASCII 文本文件。
扩展名为“.pyc”的文件代表已编译的 Python。
尽管如此,虚拟计算机仍然执行生成的代码。
原生代码
程序构建完成后,直到它被转换为其目标平台的本机二进制 CPU 指令后,才算完全转换为原生代码。
这通常涉及编写汇编代码,将其传递给汇编器,并让汇编器创建特定于平台的对象文件,而不是使用字节码。
在程序连接到平台运行时之前,它还没有准备好使用。运行时可以提供运行时服务(如动态对象加载)并构建代码将在其中执行的环境。在编译后的 C 中,存在运行时。编译后的 C++ 也有运行时。
为什么 Python 比 C 慢?
Python 执行许多健全性检查 - 整数永远不会溢出,永远无法访问无效内存,类型永远不会(静默地)不正确,数组永远不会写入或读取超出其末尾。在 Python 中,很难出现“非局部错误”,但在 C 中,相当常见的是出现一个错误,而该错误实际上并非报告错误的位置。
Python 的编译器不会进行非常高级的优化(如果有的话) - 首先,速度并不像在 C 中那样重要,而且没有那么多信息可以参考 - 例如,在 Common Lisp(另一种类似于 Python 的动态语言)中,您可以提供类型注释以获得与 C 相同的速度 - 如果您选择退出安全检查并承诺某些变量将具有某些类型,则会得到完全相同的机器代码指令(以及如果程序中存在错误,则会得到完全相同的奇怪行为)。
结论
在本文中,我们学习了 C 语言代码执行速度比 Python 快的各种原因。
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP