为什么C语言代码比Python运行得更快
本文将探讨为什么C语言代码比Python运行得更快。
Python是由Guido Van Rossum开发的最著名的编程语言之一。Python因其清晰的语法和简单的代码而受到开发者的喜爱,即使对于初学者来说也很容易上手。学习Python对于刚开始编程事业的人来说非常有利。他们可以利用Python编程培训、博客、视频、模块以及其他数以千计的资源来了解这种流行语言的各个方面。完成后,您将能够进行现代开发活动,如GUI开发、网页设计、系统管理、复杂的财务交易或计算、数据科学、可视化等。
Python比C慢是因为它是一种解释性语言
Python比C慢是因为它是一种解释性语言。
因此,执行给定语句需要更多的实际CPU指令。
您可以通过将数字1添加到变量的值或将其与给定值进行比较来验证Python代码中变量的值。
区别在于Python代码不会立即由CPU执行,而是被解释。
就性能而言,这一点造成了完全不同的结果。
几乎总是使用虚拟机来运行Python代码
虚拟计算机的另一个名称是“字节码解释器”。
解释性代码总是比实际机器代码慢,因为执行一个指令需要比执行实际机器指令要多得多的指令。
示例
考虑表达式x += 1。在Intel CPU中,寄存器自增是一个具有延迟为1和倒数吞吐量为三分之一的单个操作。
换句话说,它是Intel处理器能提供的最快的CPU指令。
在Python中,如何实现这个x += 1?
要理解这一点,您必须首先了解Python的内部工作原理。
Python的内部组件包括令牌生成器、词法分析器、字节码生成器和字节码解释器-
- 令牌生成器 - 它从给定的ASCII文本文件(Python代码)创建一个令牌流。
- 词法分析器 - Python中的这个区域与适当的缩进和间距有关。语法检查发生在这个阶段。
- 字节码生成器 - 如果进行任何优化,都是由Python组件进行的;但是,因为Python不是一种编译语言,与C编译器相比,可用的优化范围受到限制。
- Python模块被称为“字节码解释器”,它管理字节码流并为Python虚拟机提供动力(维护其状态)。
一旦生成,字节码通常会被缓存在内存中。
由于Python已经看到过的代码不需要重复进行标记化、词法分析和字节码生成的过程,这可以提高速度。
因此,我们可以只需将字节码传递给字节码解释器,而无需每次循环 while 循环时都经历标记化、词法分析和字节码创建的过程。
这样会更快吗? 实际上不会。
尽管使用缓存字节码更快,但它的执行速度不如机器码快。
真正运行代码的 CPU 不是虚拟计算机。
编译过程
与当时的其他编译语言不同,已编译的UCSD Pascal并非编译为汇编语言,而是编译为p-Code。
因此,当你想到“已编译的Pascal程序”时,会想到p-Code。如果你喜欢Java或Python,并想要假装自己创造了一些新东西,请使用“bytecode”。
此外,Python还包括“已编译的Python”概念,它是指经过令牌化、词法分析和字节码生成器处理以创建缓存字节码的Python代码,该字节码已准备好交给字节码解释器(即Python虚拟机) )。
当你看到扩展名为.py的文件时,它是一个包含Python源代码的ASCII文本文件。
以“.pyc”扩展名结尾的文件代表的是已编译的PYthon。
不过,执行代码的是虚拟计算机。
本机代码
一旦程序构建完成,直到将其转换为适用于所设计平台的本机二进制CPU指令,它才完全转换为本机代码。
与使用字节码不同,这经常涉及编写汇编代码,将其传递给汇编器,并由汇编器创建特定于平台的目标文件。
在程序连接到平台运行时之前,它还不能使用。运行时可以提供运行时服务,如动态对象加载,并建立代码将执行的环境。已编译的C中存在一个运行时。已编译的C++具有运行时。
为什么Python比C慢
- Python执行许多合理性检查-整数永远不会溢出,无效内存永远不会被访问,类型永远不会(悄悄地)不正确,数组永远不会被写入或读取到其末尾之外。在Python中,很难有“非局部错误”,但在C中,常常出现实际上错误位置与错误报告位置不一致的bug。
-
Python的编译器没有进行非常高级的优化(如果有)-首先,速度并不像C那样重要,并且可供利用的信息没有那么多-例如,在Python这样的另一种动态语言Common Lisp中,您可以提供类型注释以获得与C相同的速度-如果您选择了安全检查并承诺某些变量将具有特定类型,您将得到完全相同的机器码指令(以及完全相同的错误行为,如果程序中有错误)。
结论
在本文中,我们了解了C语言代码执行速度比Python快的不同原因。