为什么C语言代码的运行速度比Python的快
在这篇文章中,我们将了解为什么C语言代码比Python运行得快。
Guido Van Rossum开发了Python,这是最著名的编程语言之一。 Python 在开发者中很受欢迎,因为它的 语法 清晰,代码简单,即使对新手也是如此。学习Python对那些刚刚开始编程生涯的人来说是非常有利的。他们可以利用Python编程培训、博客、视频、模块和数以千计的其他资源来深入了解这种流行语言的各个方面。一旦完成,你将能够进行现代开发活动,如GUI开发、网页设计、系统管理、复杂的金融交易或计算、数据科学、可视化,以及其他列表。
Python比C慢,因为它是一种解释语言。
Python比C慢,因为它是一种解释型语言。
因此,执行一个给定的语句需要更多真正的CPU指令。
在Python代码中,你可以通过给一个变量加数字1来验证它的值,或者通过与一个给定的值相比较,看它是否小于、大于或正好等于该值。
不同的是,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-Code。
所以当你想到一个 “编译的帕斯卡程序 “时,你会想到p-Code。如果你喜欢Java或Python,并想假装你想出了一些新的东西,就使用 “字节码”。
此外,Python 包括 “编译的 Python “这一概念,它指的是已经被标记器、词法分析器和字节码生成器处理过的 Python 代码,这些代码已经准备好交给字节码解释器 (AKA Python 虚拟机) ,并被缓存。
当你看到一个扩展名为.py的文件时,它是一个包含Python源代码的ASCII文本文件。
PYthon, Compiled是以”.pyc “为扩展名的文件所代表的意思。
仍然是由虚拟计算机来执行所创建的代码。
原生代码
一旦一个程序被建立起来,它还没有完全被转换为本地代码,直到它被转换为它所设计的平台的本地二进制CPU指令。
而不是使用字节码,这经常涉及到编写汇编代码,将其传递给汇编器,并让汇编器创建特定平台的对象文件。
在程序连接到平台运行时之前,它还没有准备好被使用。运行时可以提供动态对象加载等运行时服务,并建立代码的执行环境。在已编译的C语言中,存在一个运行时。已经编译的C++有一个运行时。
为什么 Python 比 C 慢?
- Python 执行了大量的理智检查–整数永远不会溢出,无效的内存永远不会被访问,类型永远不会 (沉默地) 不正确,数组永远不会被写入或读出到其末端。在 Python 中,很难出现 “非本地错误”,然而在 C 中,出现一个实际上不在报告错误的地方的错误是相当普遍的。
-
Python的编译器并没有做非常高级的优化(如果有的话)–首先,速度并不像在C语言中那么重要,也没有那么多的信息可以参考–例如,在Common Lisp,另一种像Python一样的动态语言中,你可以提供类型注释来获得和C语言一样的速度–如果你选择放弃安全检查并承诺某些变量将具有某些类型,你会得到完全相同的机器码指令(如果你的程序中有错误,也会有完全相同的奇怪行为)。
总结
在这篇文章中,我们已经了解了不同的原因,即为什么C语言的代码执行速度比Python快。