前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
我写了一个编程语言,你也可以做!
各位好。我一直在专注于开发一个称为“Pinecone”的语言,已经持续6个月的时间。
用户9861443
2024/04/15
1740
我写了一个编程语言,你也可以做!
Python写的Python解释器(一)
导论 Byterun是一个用Python实现的Python解释器。它的结构类似于CPython(Python的主流实现方式)。
哒呵呵
2018/08/06
1.6K0
为什么编译原理被称为龙书?
这本书很有意思,它的书名是 《Compilers: Principles, Techniques, and Tools》,也就是编译器的原则、技术和工具。但它却画出了一个恐龙和骑士,恐龙身上写的是 Complexity of Compiler Design,也就是复杂的编译器设计,骑士的盾上写的是 Syntax Directed Granslation,也就是语法翻译。骑士的剑上看的不是很清楚,我猜测应该是优秀的编译器的意思。这是征服复杂性的隐喻。优秀的编译器会直接征服复杂的编译,复杂的编译设计永远无法攻破语法翻译。
cxuan
2020/07/17
1.4K0
linux和windows系统开发语言,java 运行机制,编译原理(C/C++的源码到机器语),编译器和解释器,C/C++与Java的区别
windows:汇编、C、VB、C++; linux:汇编、C;linux gui主要有两大类:gtk是C和C++的,qt是C++的。
zhangjiqun
2024/12/16
1410
linux和windows系统开发语言,java 运行机制,编译原理(C/C++的源码到机器语),编译器和解释器,C/C++与Java的区别
Python字节码介绍
如果你曾经编写亦或只是使用Python语言,那么你可能已经习惯了看Python源码文件; 源码的文件名以.py结尾。或许你也已经注意到了另一种类型的文件,文件名以.pyc结尾,或许你已经听说过它们就是Python的“字节码”文件。(但在Python 3上却难觅其踪 -- 原因是它们不再与.py文件出现在同一个目录中,而是放在一个名为__pycache__的子目录中了)。或许你也已听说过这是一种程序加速机制。通过防止Python每次运行时都重新解析源代码从而加快程序运行。
IT派
2018/07/30
1.6K0
Python字节码介绍
JavaScript代码是如何被执行的
计算机不能直接理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。根据语言的执行流程,可以把语言分成编译型语言和解释型语言。
木子星兮
2020/07/16
1.2K0
JavaScript 是怎么运行起来的?
JavaScript 的运行原理,是我面试的时候经常会问到的问题,但是根据过往的面试结果来看,这部分能理解的很清楚的不足 20%,大多数同学热衷于去学习一些 Vue、React 这样的框架,以及一些新的 API,却忽视了语言的根本,这是个非常不好的现象。
ConardLi
2022/02/18
6400
JavaScript 是怎么运行起来的?
热度碾压 Java、C#、C++的 Python,为什么速度那么慢?
眼下 Python 异常火爆,不论是 DevOps、数据科学、Web 开发还是安全领域,都在用 Python——但是它在速度上却没有任何优势。
CDA数据分析师
2018/08/14
2.2K0
热度碾压 Java、C#、C++的 Python,为什么速度那么慢?
为什么Python这么慢?
Python语言近年来人气爆棚。它广泛应用于网络开发运营,数据科学,网络开发,以及网络安全问题中。
大数据文摘
2018/08/21
1.2K0
为什么Python这么慢?
c语言和python区别
除了在语法使用上面的区别外,c语言和python的本质区别可能是在其语言性质上面的区别。
Twcat_tree
2022/12/05
9160
【Story】编译器的基础概念与类型分类
编译器是一种将高级编程语言(如C、C++、Java、Python等)编写的源代码转换为机器语言或中间代码的工具,使计算机能够执行该程序。编译器的开发和使用在计算机科学中具有核心地位,它帮助程序员将抽象的、高层次的算法和逻辑翻译成具体的、计算机能够理解和执行的指令。
LuckiBit
2024/12/11
3540
JS代码是怎么被执行的
我们看到的JS都是在浏览器中或者在Node环境中运行的对吧,那不论是浏览器还是Node,负责编译并且解释执行JS代码的都是一个叫做V8的东西,所以这个问题其实就是V8引擎是怎么去运行JavaScript的,而js和C/C++/Go/Rust这类静态编译的语言不同,这些静态编译的语言通过编译器把代码变成机器码,然后在机器上运行,js呢在编译后会生成字节码,然后在v8的虚拟机上运行字节码,java和python也有自己的虚拟机实现,这些语言都将生成的字节码放在虚拟机上运行,相比于直接以机器码运行的语言,这些语言在损失了性能的同时又获得了更多功能上的遍历,然后我们回到V8引擎是如何执行JS的问题。
ek1ng
2023/03/08
3.2K0
JS代码是怎么被执行的
引论
局部优化:常量合并、公共子表达式的提取等 循环优化:强度削减(较快操作代替较慢操作)、代码外提(循环不变量提出循环)
hotarugali
2022/03/01
9840
引论
一篇文章理解编译全过程
https://www.cnblogs.com/fisherss/p/13905395.html
zz_jesse
2020/11/06
1.2K0
一篇文章理解编译全过程
二、Python介绍
Python 是一门什么样的语言? python是一门动态解释性的强类型定义语言。 编程语言主要从以下几个角度为进行分类,编译型和解释型、静态语言和动态语言、强类型定义语言和弱类型定义语言,每个分类代表什么意思呢,我们一起来看一下。 一、低级语言与高级语言 最初的计算机程序都是用0和1的序列表示的,程序员直接使用的是机器指令,无需翻译,从纸带打孔输入即可执行得到结果。后来为了方便记忆,就将用0、1序列表示的机器指令都用符号助记,这些与机器指令一一对应的助记符就成了汇编指令,从而诞生了汇编语言。
酱紫安
2018/04/16
8780
二、Python介绍
为什么Python这么慢?
答案在很大程度上取决于您正在运行的应用程序的类型。没有一个基准测试是完美的,但是计算机语言基准测试游戏是一个很好的起点。
HuangWeiAI
2019/11/25
1.6K0
为什么Python这么慢?
编译原理学习笔记-1
机器不能理解我们用高级语言编写的代码,所以要在程序执行前将高级语言“翻译”为机器语言。这是一个将源语言程序转化为目标语言程序的过程,它依靠翻译程序来完成。
Chor
2020/03/17
7960
编译原理学习笔记-1
Python之路,Day1 - Python基础1
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。  
超蛋lhy
2018/10/09
6640
Python之路,Day1 - Python基础1
01 . Python简介
Python简介 计算机语言 人与计算机之间交互的语言 机器语言 一定位数组合二进制的0和1的序列,被称为机器指令,机器指令的集合就是机器语言 与自然语言差异太大、难学、难懂、难记、难差错. 汇编语言 用一些助记符号替代机器指令,称为汇编语言,ADDA,B指的是将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中. 汇编语言写好的程序需要汇编程序转换成机器指令 汇编语言只是稍微好记了写,可以认为就是机器指令对应的助记符,只是符号本身接近自然语言. 程序 算法+数据结构=程序 数据一切程序的核心 数据结构是
iginkgo18
2020/09/27
4590
让Python代码运行更快的方式
Python因其强大、灵活且易于使用等特性,而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用。但是就语言的设计,也就是它天然的解释能力还有它的运行时的动态性而言,Python总是比C或C ++这样的机器本地语言慢一个数量级。
AI科技大本营
2019/05/28
1.2K0
相关推荐
我写了一个编程语言,你也可以做!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档