首页 > 编程语言 >一文看懂,为什么 Python 运行速度如此慢?

一文看懂,为什么 Python 运行速度如此慢?

时间:2024-06-12 18:57:40浏览次数:11  
标签:解释器 一文 Python 代码 内存 类型 运行 语言

在这篇文章中,我将介绍Python的不同特性,我们将了解为什么这使其成为当今最完整的语言之一,但速度不够快。

在编程社区中,众所周知Python编程语言在速度方面并不占优势。

"但是就是慢..."

在这篇文章中,我将介绍Python的不同特性,我们将了解为什么这使其成为当今最完整的语言之一,但速度不够快。但首先,让我们掌握一些关于编程语言的基本知识。

抽象级别

正如我们可能知道的那样,编程语言通常根据其抽象级别进行描述。

  • 低抽象级别表明该语言更接近硬件(难以解释)
  • 高级别表示代码更接近用户(易于解释)。

抽象级别(从硬件到现代编程语言)

C++、PHP、Java、Python等都被认为是现代(或高级)编程语言,因为它们可以在几乎任何类型的系统上运行。在汇编语言中,我们必须根据每个特定处理器的指令编写不同的程序(无法在不同的CPU上运行相同的代码)。例如,如果我们创建一个打印“Hello world”的程序并将代码发送给我们的朋友(他有不同的计算机型号),当他尝试执行它时,它可能会失败。

现代语言:金字塔的最后抽象层

现代语言抽象

尽管是离机器码最高的抽象,但在金字塔的最后一层也有层次结构。一方面,我们可以找到过程化语言,如C,我们需要逐步知道自己在做什么。这具有非常高效的优点,但缺点是复杂且不够灵活。另一方面,其他语言通过让我们使用更易读和灵活的代码来简化任务。这就是Python的情况。我们几乎可以用它做任何事情,而且易于实现,但在某些任务上效率不高。

但为什么Python确切地说是“慢”呢?

让我们回顾一些语言特性以回答这个问题。

解释性语言

首先,Python是一种解释性语言,这意味着代码由软件程序(称为解释器)逐行读取和执行,在运行时进行。这是将代码转换为机器代码的一种方式。

编译型语言

另一种使代码“为机器可理解”的方式是通过编译过程。在这种情况下,源代码在实际在计算机上运行之前通过编译器转换为机器代码。

编译型与解释型语言

为什么解释性方式更慢?

在解释性语言中,源代码的每一行在执行过程中都会即时转换为机器代码。这意味着每次程序运行时,解释器必须解析、分析和执行代码,这增加了与直接运行预编译机器代码相比的开销。例如:如果某段代码运行多次(例如,在循环内),解释器必须每次遇到时读取和转换它。相反,编译程序将直接运行机器代码,无需在通过循环时重新翻译它。

CPython及其全局解释器锁(GIL)

标准的Python解释器是CPython。它由C和Python编写,将Python代码编译成字节码,然后进行解释。为了防止多个本机线程同时执行Python字节码,CPython使用全局解释器锁。这个锁是必要的,因为CPython的内存管理不是线程安全的。然而,在多线程程序中,它可能是一个显著的瓶颈,限制了在多核处理器上进行多线程的性能提升。

全局解释器锁的工作流程

动态类型

此外,Python是动态类型的,这意味着在初始化变量时不需要声明变量的类型。这对效率有何影响呢?嗯,在动态类型语言中,类型是在运行时确定的。这意味着解释器需要在执行代码片段时进行类型检查。这需要额外的处理来确定每个变量的类型以及根据这些类型执行操作的方式。而动态类型语言的对立面是什么?

静态类型语言

在这种情况下,变量的类型在编译时而不是在运行时确定。因此,类型在编译时已知,编译器可以更激进地优化代码执行。这导致更快但不够灵活的程序。一些采用这种方法的语言包括C++和Rust。

静态类型与动态类型语言

垃圾收集

垃圾收集是一种编程语言运行时系统用于回收程序不再使用的内存的自动内存管理形式。Python通过垃圾收集自动管理其对象的内存分配和释放。它使用的主要垃圾收集方法是引用计数。Python中的每个对象都有一个引用计数,即指向它的引用数量。当引用计数降至零,即不再有指向该对象的引用时,它会立即从内存中删除。

垃圾收集器的工作流程

然而,垃圾收集是一把双刃剑...

它通过自动清理未使用的对象极大简化了内存管理,有助于防止由于手动内存管理导致的内存泄漏和其他错误。但它引入了开销和不可预测性,可能影响应用程序的性能。 

标签:解释器,一文,Python,代码,内存,类型,运行,语言
From: https://blog.csdn.net/leyang0910/article/details/139481531

相关文章

  • 【python笔记】—— 模块
    模块和包概念的进化史Python程序由模块组成。一个模块对应python源文件,一般后缀名是:.py模块由语句组成。运行Python程序时,按照模块中语句的顺序依次执行语句是Python程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等标准库模块(standardlibrary) python模......
  • Python字符串操作(1)
    -----案例1:要求-----读取用户输入的一串用逗号分隔的值,然后对其中的数字进行求和,并输出结果。-----案例1:代码示例-----myinput=input("请输入:")#提示用户输入,并将输入的内容赋值给变量myinputls=myinput.split(',')#使用逗号作为分隔符,将输入的字符串分割成......
  • 用ESP32(ESP32-CAM)(Micropython)、水位传感器、继电器、水泵 做根据水位自动加水的设
    基本流程水位传感器放在水缸内上方位置,水位到达水位传感器所在的位置时,水位传感器触发,并输出信号给到ESP32(ESP32CAM)。然后ESP32(ESP32CAM)控制继电器闭合,水泵启动并工作60S。之后还是根据传感器信号,决定继电器是闭合还是断开,一直循环下去。main.py点击查看main.pyfrom......
  • DH算法python 原理说明和演示
    importgmpy2p=17g=3x_a=15x_b=13#y_a=a_g^x_amoda_py_a=6#y_a=a_g^b_xmoda_py_b=12#a#y_s=y_b^x_amoda_p#y_s=12^15mod17#b#y_s=ya^x_bmoda_p#y_s=6^12mod17if__name__=='__main__�......
  • 给苹果电脑深度清理,以提高运行速度
    在众多电脑用户中,有一部分人的苹果电脑即便使用了多年,其运行速度依然十分出色,即便是运行大型程序也毫无压力。深入探究后发现,他们的秘诀就在于会定期进行苹果电脑深度清理,将那些冗余的垃圾清理出去,让电脑宛如新生般轻盈。那么,究竟如何实现苹果电脑的深度清理呢?让我们一起来看看......
  • 苹果WWDC24一文总结,携手OpenAi,开启Ai新篇章
    北京时间6月11日凌晨1点,苹果2024年全球开发者大会(WWDC)正式开幕。按照往年惯例,每年的WWDC大会,苹果都会将重心放在对新版系统的介绍上,本次也不例外,苹果发布了包括iOS18、iPadOS18、macOS15以及visionOS2等在内的一系列软件更新。除了例行的系统更新,发布会的最重头大戏就是AI......
  • python-爬虫-邮箱发送
    #-*-coding:utf-8-*-#发送信息到邮箱importemail.utilsimportsmtplibfromemail.mime.textimportMIMEText#发送文本fromemail.mime.imageimportMIMEImage#发送图片fromemail.mime.multipartimportMIMEMultipartfromemail.headerimportHeader""&quo......
  • 一文搞懂雷达脉冲压缩和匹配滤波器
    目录1.前言2.脉冲压缩原理3.匹配滤波器4.频域相乘法5.举例微信公众号获取更多FPGA相关源码:1.前言为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回......
  • python-爬虫-获取浏览器的cookies
    1、封装浏览器对象#-*-coding:utf-8-*-"""封装类将获取浏览器的对象封装成一个类调用方法:1、importGet_Browser2、driver=Get_Browser.Get_Browsers().get_browser()"""fromseleniumimportwebdriverclassGet_Browsers:def__init__(self......
  • 朴素贝叶斯分类器 #数据挖掘 #Python
    朴素贝叶斯分类器是一种基于概率统计的简单但强大的机器学习算法。它假设特征之间是相互独立的(“朴素”),尽管在现实世界中这通常不成立,但在许多情况下这种简化假设仍能提供良好的性能。基本原理:朴素贝叶斯分类器利用贝叶斯定理,计算给定输入特征条件下属于某个类别的概率,并选择......