【并发编程Python】为什么Python这么慢

news2025/1/17 5:51:01

Python速度慢的所有原因

        Python作为一门非常优秀的计算机语言,其速度慢给Python减了很多分,也是其一直被诟病的主要原因之一,通常情况下,PythonJava/C++慢约5-10倍,在一些特殊的情况下Python甚至比C++慢100~200倍,那么影响Python速度慢的原因有什么呢?

  • 1. 解释性语言: Python是一种解释性语言,它需要将代码逐行解析成机器代码来执行。与编译型语言相比,解释型语言需要更加频繁地执行解释器,因此通常速度较慢。
  • 2. 全局解释器锁(GIL): Python的多线程模型使用了全局解释器锁。这意味着每个Python进程只能同时执行一个线程。当一个线程需要使用CPU时,必须等待其他线程释放锁。这降低了并发执行的效率。
  • 3. 动态类型: Python是一种动态类型的语言,变量在运行时可以更改其类型。这对于开发者来说非常方便,但同时也需要更多的代码来处理类型检查和内存管理,这会降低运行速度。
  • 4. 内存管理: Python的内存管理机制是自动化的,包括内存分配和释放。虽然这是一个很好的特性,但是当程序需要处理大量数据时,可能需要频繁地进行内存分配和释放,导致程序变得缓慢。
  • 5. 库的质量: Python的生态系统非常庞大,但是不是所有的库都能提供高效的实现。如果使用低质量的库,它们可能会导致程序运行缓慢,甚至会崩溃。
  • 6. 程序本身设计不良: 在程序本身设计不合理的情况下,它可能会非常缓慢,这与使用的语言无关。在这种情况下,对程序进行重构可能是提高性能的最佳方法。

NOTE这里指的Python速度慢,是指没有任何限制情况下的速度慢,类似于ACM、CCPC和蓝桥杯等算法比赛中,常常会限制不能导入pip包,即无法使用并发编程的情况,不在考虑范围内。

Python速度慢的头号嫌疑犯GIL

如果对协程、线程、进程还不太了解的朋友,强烈介意先看看这篇文章:

一文了解并发编程,协程、线程、进程http://t.csdn.cn/rQz10


GIL,全称为全局解释器锁(Global Interpreter Lock),是CPython解释器实现中的一种机制。它的作用是在任意时刻,只允许一个线程执行Python字节码。这样做的原因是,CPython中的内存管理不是线程安全的,多个线程同时操作Python对象可能会导致内存管理错误,例如引用计数错误、内存泄漏等。 虽然GIL带来了线程安全的好处,但同时,GIL会把Python代码的执行限制在同一时刻只能有一个线程执行,这就导致了:

  1. Python的多线程由于GIL的限制,多个线程无法同时执行计算操作,只能交替执行。这反而会增加上下文切换的开销,导致程序运行效率较低。也就无法同时执行多个CPU-bound的任务(比如大量的计算操作),只能在IO-bound的场景下才有明显的优势。
  2. Python的多进程中虽然每个进程都拥有自己的独立的Python解释器和GIL,GIL使得多进程每一个进程中同一时间只能使用一个线程,同样的多线程中也同一时间只能使用一个线程。

(GIL使得多线程同一时间只能运行一个线程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/435327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构——B树和B+树

数据结构——B树和B树 一、B树1.B树的特征2.B树的插入操作3.B树的删除操作4.B树的缺点 二、B树B树的特征 平衡二叉树或红黑树的查找效率最高,时间复杂度是O(nlogn)。但不适合用来做数据库的索引树。 因为磁盘和内存读写速度有明显的差距,磁盘中存储的数…

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——③整理、验证数据,建立Dataset对象

文章目录 数据整理整理出所有的dcm文件整理出所有的xml标注文件整理数据①——舍弃错误的标注文件整理数据②——两个标注文件指向同一个目标图片的情况封装函数,传入xml文件,显示标注效果 整理数据③——将PETCT的三通道图像转成平扫CT的单通道图像格式…

企业费控,驶向「一体化」

在数字化于企业内部各个环节实现平权、成为标配的当下,财务,这个被称为“控制企业生命力”的核心环节,是否应该拥有新的价值? 作者| 皮爷 出品|产业家 2022年年中,施伟和分贝通的团队接到一项“特殊需求”。 这个…

在职读研专业——劳动经济学

研究方向:劳动经济学主要研究劳动力市场现象及其所引起的劳动力资源配置等相关问题,包括劳动力供给、劳动力需求、就业、工资、人力资本投资、收入分配等。例如:劳动力市场失衡背后各种因素的变化,如何通过资源的配置使劳动资源配…

MySQL innobackupex 备份工具使用总结

前言 在MySQL备份以及搭建从库的过程中,我们针对比较小的库大多采用的是mysqldump,简单,方便。但是在大库进行搭建从库的时候,且数据库主机没有一个很好的存储来满足备份,这个时候就需要使用innobackupex来协助你来做一…

Pocsuite3框架POC/EXP编写练习:Flask(Jinja2) 服务端模板注入漏洞

Pocsuite3 是由知道创宇 404 实验室打造的一款基于 GPLv2 许可证开源的远程漏洞测试框架。可以用来编写POC/EXP,今天借助Flask框架下的SSTI漏洞练习记录一下Pocsuite3框架的配置和编写过程。 官方文档:Pocsuite3 是什么? | Pocsuite3 安装 …

小黑继续跟着沛奇老师学携程:携程基础3

3.异步编程 3.1事件循环 理解成一个死循环,去检测并执行某些代码 # 伪代码任务列表 [任务1,任务2,任务3,...] while True:可执行的任务列表,已完成的任务列表 去任务列表中检查所有任务,将可执行和已完…

安装、启动和登陆doccano

一、安装 1、使用的Pycharm安装的doccano 2、初始化数据库 doccano init 3、创建用户名和密码 # admin是用户名,pass是密码,都可以自定义 doccano createuser --username admin --password pass 二、启动 1、在一个Terminal终端启动webserver服务 …

自适应控制专栏目录及介绍

目录 自适应控制专栏目录及介绍第一篇:[具有不确定参数系统的自适应跟踪控制设计_ADi_hhh的博客-CSDN博客](https://blog.csdn.net/qq_45830323/article/details/129713051)第二篇:[(SISO)单输入单输出系统的模型参考自适应控制_A…

cdh Hue集成sentry的权限管理详细步骤

hue登录hue的第一个用户要用hue用户创建,默认hue为超级用户,hue用户页面的权限可以管理很多用户操作,比如查看hdfs目录,使用其他组件,授权功能等等 一.hive的配置 1.关闭模拟,开启sentry 2.添加配置(注意配置的位置) <property> <name>sentry.hive.tes…

【C++11】lambda表达式

目录 lambda表达式 1.1 lambda表达式出现的原因 1.2 lambda表达式语法 1.3 函数对象与lambda表达式 lambda表达式 1.1 lambda表达式出现的原因 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法 测试代码 #include <…

苹果撤离中国市场?中国市场太重要,印度制造是备胎

苹果在中国之行后&#xff0c;却计划进一步扩大印度制造iPhone的比例&#xff0c;甚至将iPhone15全数交给印度制造&#xff0c;业界因此认为苹果正在离开中国市场&#xff0c;然而这完全是臆想&#xff0c;中国市场对苹果来说仍然非常重要&#xff0c;它不会轻易舍弃这个市场。…

【Unity VR开发】结合VRTK4.0:添加碰撞忽略器

语录&#xff1a; 最远的旅行&#xff0c;是从自己的身体到自己的心&#xff0c;是从一个人的心到另一个人的心。坚强不是面对悲伤不流一滴泪&#xff0c;而是擦干眼泪后微笑面对以后的生活。 前言&#xff1a; 模块化提供了一种允许两个或者多个对象忽略彼此碰撞的方法&#x…

Logstash:多管道配置

我们大多数人已经熟悉 Elastic 产品。 在此博客中&#xff0c;我们将逐步介绍配置 Logstash 以使用多个管道摄取和处理数据的步骤。 Logstash 是一种开源数据处理管道&#xff0c;可让你摄取、转换和输出数据。 它是从各种来源收集和处理大量数据的强大工具&#xff0c;可用于管…

IP协议头

IP 4位版本号&#xff08;version&#xff09;4位头部长度&#xff08;header length&#xff09;8位服务类型&#xff08;Type Of Service&#xff09;16位总长度&#xff08;total length&#xff09;16位标识&#xff08;id&#xff09;3位标志字段13位分片偏移&#xff08;…

Spring的循环依赖

什么是循环依赖&#xff1f; 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 bean 互相持有对方&#xff0c;最终形成闭环。比如 A 依赖于 B&#xff0c;B 依赖于 C&#xff0c;C 又依赖于 A。如下图&#xff1a; 注意&#xff0c;这里不是函数的循环调用&…

金陵科技学院五年一贯制专转本计算机应用基础考试大纲

金陵科技学院五年一贯制专转本计算机应用基础考试大纲 一、参考书目&#xff1a; 《大学计算机信息技术教程》&#xff0c;张福炎&#xff0c;孙志挥&#xff0c;南京大学出版社&#xff0c;《全国计算机等级考试一级教程计算机基础及MS Office应用》&#xff0c;教育部考试中…

书写我的人生回忆录-这应该是给子女和父母最好的礼物

作为一个业余的软件开发爱好者&#xff0c;我又捣鼓了一个有意思的小东西 &#xff0c;使用完全免费哈 您可以是以子女的身份帮助父母来完成这份回忆录&#xff1a; 《书写我的人生回忆录》是一款软件&#xff0c;其中包含70个问题&#xff0c;涵盖了父母的个人喜好、家庭、工…

关于图床使用

安装windows终端 Windows 终端安装 | Microsoft Learn 安装oh-my-posh 安装scoop &#xff08;后续都使用PowerShell 7.2.10&#xff09;&#xff1a; > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first ti…

代谢组学-南京医科大学胡志斌团队绘制心脏发育全周期多组学图谱

文章标题&#xff1a;Multi-omics profifiling visualizes dynamics of cardiac development and functions 发表期刊&#xff1a;Cell Reports 影响因子&#xff1a;9.995 作者单位&#xff1a;南京医科大学 百趣提供服务&#xff1a;发现代谢组学HD-MIX版 百趣代谢组学分…