当前位置:首页 > 编程技术 > 正文内容

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

yc8881年前 (2023-02-19)编程技术272

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

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

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

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代码)创建一个令牌流。

  • Lexical Analyzer - Python的这个领域涉及适当的缩进和间距。此时将进行语法检查。

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

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

生成后,字节码通常缓存在内存中。

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

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

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

尽管使用缓存字节码更快,但它的执行或操作速度不如机器代码快。

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

编译过程

编译的UCSD Pascal与当时的其他编译语言不同,没有编译为汇编语言。相反,它被编译成p代码。

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

此外,Python 还包括“编译的 Python”的概念,它指的是由分词器、词法分析器和字节码生成器处理的 Python 代码,以创建准备好提供给字节码解释器(AKA Python 虚拟机)的缓存字节码。

它是一个包含 Python 源代码的 ASCII 文本文件,当您看到带有 extension.py 的文件时。

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

尽管如此,虚拟计算机仍会执行创建的代码。

原生代码

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

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

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

为什么 Python 比 C 慢?

  • Python 执行大量健全性检查 - 整数永远不会溢出,无效内存永远无法访问,类型永远不会(静默地)不正确,数组永远不会被写入或读取超过它们的末尾。在 Python 中,很难有一个“非本地错误”,但在 C 语言中,有一个实际上不是报告错误的错误是相当普遍的。

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

结论

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


本站发布的内容若侵犯到您的权益,请邮件联系站长删除,我们将及时处理!


从您进入本站开始,已表示您已同意接受本站【免责声明】中的一切条款!


本站大部分下载资源收集于网络,不保证其完整性以及安全性,请下载后自行研究。


本站资源仅供学习和交流使用,版权归原作者所有,请勿商业运营、违法使用和传播!请在下载后24小时之内自觉删除。


若作商业用途,请购买正版,由于未及时购买和付费发生的侵权行为,使用者自行承担,概与本站无关。


本文链接:https://www.10zhan.com/biancheng/10571.html

标签: Python
分享给朋友:

“为什么C代码比Python代码运行得更快?” 的相关文章

【说站】laravel实现自定义404页面并给页面传值

【说站】laravel实现自定义404页面并给页面传值

以 laravel5.8 为例,虽然有自带的404页面,但太简单,我们更希望能自定义404页面,将用户留在站点。实现的方式很简单,将自定义的视图文件命名为 404.blade.php,并放到 reso...

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

【说站】C#在PDF中添加墨迹注释Ink Annotation的步骤详解

PDF中的墨迹注释(Ink Annotation),表现为徒手涂鸦式的形状;该类型的注释,可任意指定形状顶点的位置及个数,通过指定的顶点,程序将连接各点绘制成平滑的曲线。下面,通过C#程序代码介绍如何...

【说站】Java从resources读取文件内容的方法有哪些

【说站】Java从resources读取文件内容的方法有哪些

本文主要介绍的是java读取resource目录下文件的方法,比如这是你的src目录的结构├── main│ ├── java│ │ └── ...

【说站】linux中redis如何以redis用户重启?

【说站】linux中redis如何以redis用户重启?

通过上图我们可以看到,目前状态是已经以 redis 用户启动着,我想修改下 redis 的密码,然后怎么以 redis 用户重启呢?redis 是 nologin 用户,不能通过 su redis 切...

【说站】使用systemctl配置dnspod-shell实现ddns

【说站】使用systemctl配置dnspod-shell实现ddns

这个是毛子路由器上用的脚本,由于碳云的nat服务器公网IP不断的变,因此只好通过ddns来稳定连接nat服务器了。顺便水一篇文章,大家新年快乐。使用前需要将域名添加到 DNSPod 中,并添加一条A记...

【说站】Python获取最新疫情数据实现动态地图实时展示各地情况

【说站】Python获取最新疫情数据实现动态地图实时展示各地情况

疫情降临转眼已经第三年了,时间过得真快,愿疫情早点结束,世界不再多灾多难。最近疫情稍微好转一些了,所以咱们获取一下最新的疫情数据,做个可视化地图看看。效果展示获取到的数据咱们保存到表格可视化地图颜色是...