Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么C代码比Python代码运行得更快?

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

作者头像
很酷的站长
发布于 2023-02-20 01:19:06
发布于 2023-02-20 01:19:06
1.5K0
举报

在本文中,我们将了解为什么 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 更快的不同原因。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
杨校老师课堂之Hadoop环境搭建(二)
当下,在VMWare内浏览器中进行访问web页面(http://hadoop1:50070)来查看Hadoop的信息
杨校
2022/05/07
3370
杨校老师课堂之Hadoop环境搭建(二)
Hadoop 在 Centos7 下的单机布署(二).HDFS.Pseudo-Distributed Operation
Hadoop 生态圈中的其它项目可以参考 Hadoop-related projects
franket
2021/08/12
4270
Hadoop2.7.6_01_部署
1. 主机规划 主机名称 外网IP 内网IP 操作系统 备注 安装软件 mini01 10.0.0.11 172.16.1.11 CentOS 7.4 ssh port:22 Hadoop 【NameNode SecondaryNameNode】 mini02 10.0.0.12 172.16.1.12 CentOS 7.4 ssh port:22 Hadoop 【ResourceManager】 mini03 10.0.0.13 172.16.1.13 CentOS 7.4 ssh port:22 Ha
踏歌行
2020/10/15
5150
Hadoop2.7.6_01_部署
Spark2.x学习笔记:5、Spark On YARN模式
程裕强
2018/01/02
3.7K1
Spark2.x学习笔记:5、Spark On YARN模式
hadoop+spark+zookeeper+hive的大数据分布式集群搭建
hadoop+spark+zookeeper分布式集群部署这里的排版可能不太好看因为本是我直接写在博客上的外挂标签修剪的,如果想要获得更好的阅读体验建议在我的博客中浏览1.环境准备环境的准备基于我写的初始化脚本,自用7.x系列的CentOS,老版本的就支持CentOS/Redhat6,7,8但是有点不完善,需要可以邮箱或者博客留言。os\ip hostnameblock centos7.9 192.168.222.226master rsmanage
Tianlin_Zz
2022/11/18
8780
Hadoop基础教程-第9章 HA高可用(9.3 HDFS 高可用运行)(草稿)
程裕强
2018/01/02
1.3K0
Hadoop基础教程-第9章 HA高可用(9.3 HDFS 高可用运行)(草稿)
Hadoop集群搭建
'readonly' option is set (add ! to override) 查看5.1解决。
ha_lydms
2023/08/10
5690
Hadoop集群搭建
Hadoop基础教程-第2章 Hadoop快速入门(2.4 Hadoop单机运行)
或者cd /opt/hadoop-2.7.3进入Hadoop根目录 通过pwd命令可以知道当前所在目录
程裕强
2022/05/06
3310
Hadoop基础教程-第2章 Hadoop快速入门(2.4 Hadoop单机运行)
win10搭建hadoop和spark
jdk8-x64:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html
静谧星空TEL
2021/04/27
1.2K0
win10搭建hadoop和spark
Linux下搭建Hadoop详细步骤
1:在Linux下输入命令vi /etc/profile 添加HADOOP_HOME
用户5166556
2019/04/16
1.7K0
CentOS 7.3 + Server JRE 1.8 + Hadoop-2.8.0
本文节选自《Netkiller Linux 手札》由于工作的关系最近几年没有使用hadoop,今天看了一下版本已经到了2.8, 跟数年前用的版本差异还是很大的。于是便想更新一下文档,顺便温故知新。
netkiller old
2018/03/05
1.3K0
CentOS 7.3 + Server JRE 1.8 + Hadoop-2.8.0
Hadoop2.6.5 start-dfs.sh 启动流程
执行脚本链路: start-dfs.sh -> hdfs-config.sh -> hadoop-config.sh -> hadoop-daemons.sh -> slave.sh -> hadoop-daemon.sh -> hadoop-env.sh -> hdfs
spbreak
2024/05/04
3220
Hadoop2.6.5 start-dfs.sh 启动流程
hadoop集群搭建
其他两台机器改一下我们的hostname就行了 node2 node3(重复上面的操作)
背雷管的小青年
2020/08/24
3.2K0
hadoop集群搭建(超详细版)「建议收藏」
查看主机名hostname(文件修改后没有重启主机名没有生效,可以用hostname临时生效)
全栈程序员站长
2022/11/04
3.6K0
hadoop集群搭建(超详细版)「建议收藏」
Hadoop分布式集群环境搭建
之前我们已经介绍了如何在单机上搭建伪分布式的Hadoop环境,而在实际情况中,肯定都是多机器多节点的分布式集群环境,所以本文将简单介绍一下如何在多台机器上搭建Hadoop的分布式环境。
端碗吹水
2020/09/23
2.1K0
Hadoop分布式集群环境搭建
0基础搭建Hadoop大数据处理-集群安装
  经过一系列的前期环境准备,现在可以开始Hadoop的安装了,在这里去apache官网下载2.7.3的版本 http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz   不需要下载最新的3.0版本, 与后续Hive最新版本有冲突,不知道是不是自己的打开方式不对。     hadoop有三种运行方式:单机、伪分布式、完全分布式,本文介绍完全分布式。 安装Hadoop   现在有三个机器,一个Mast
欢醉
2018/01/22
1.2K0
0基础搭建Hadoop大数据处理-集群安装
Hadoop基础教程-第3章 HDFS:分布式文件系统(3.4 HDFS集群模式)
【2018-01-27补充】 感谢吴家行hang的提醒,这里node2和node3也要进行类似的环境变量配置。
程裕强
2022/05/06
2850
Hadoop基础教程-第3章 HDFS:分布式文件系统(3.4 HDFS集群模式)
Hadoop高可用(HA)集群搭建
HA:High Available,高可用 在Hadoop 2.0之前,在HDFS集群中NameNode存在单点故障 (SPOF:A Single Point of Failure) 对于只有一个NameNode的集群,如果NameNode机器出现故障(比如宕机或是软件、硬件升级),那么整个集群将无法使用,直到NameNode重新启动
CoderJed
2018/09/13
4.4K0
Hadoop高可用(HA)集群搭建
Hadoop2.7.6_07_HA高可用
  hadoop-ha严格来说应该分成各个组件的HA机制——HDFS的HA、YARN的HA
踏歌行
2020/10/15
7530
Hadoop2.7.6_07_HA高可用
docker搭建hadoop集群
前置条件:jdk环境,zookeeper环境在前期需要安装好,这个可以看之前的文章。
千羽
2023/08/28
8540
docker搭建hadoop集群
相关推荐
杨校老师课堂之Hadoop环境搭建(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档