python 性能慢的头号通缉犯:全局解释器锁GIL


目录

python速度慢的两大原因

什么是GIL锁

为什么会产生GIL这个东西

怎样规避GIL带来的限制


python速度慢的两大原因

相比于C/C++/java 等语言,python的执行速度确实慢,在一些特殊场景下python的执行速度甚至要比C/C++慢100~200倍。

由于速度比较慢的原因 很多公司的基础架构代码依然使用的C/C++,比如腾讯/阿里/字节的:搜索引擎,推送引擎。

造成python 速度慢的原因一:

动态类型语言:边解释边编译。在C和C++代码执行时都需要先编译为机器码,机器码的执行效率是非常高的,而python不会先进行编译,而是在执行是一边解释一边执行,从源码到机器码的过程就导致python的速度大幅度下降。

变量:python中的变量是可以随时切换的,比如现在是一个字符串一会就又变成了列表,这就导致python在执行时需要时刻去判断类型。

造成python 速度慢的原因二:

GIL无法利用CPU多核执行。

什么是GIL锁

全局解释器锁(Global Interpreate Lock,缩写GIL)

是python程序设计者设计的,是解释器用于同步线程的一种机制,它使得任何时候,不管你开启了多少个线程都只允许一个线程执行,即便是在多核心处理器上,使得GIL的解释器也只允许执行一个线程。

 如图开启了三个线程,当 Thread1执行时,这是它是处于持有锁的状态,它执行时其它线程是属于一个等待状态,当它遇到了I/O操作,这时将锁释放Thread2将去执行,交替进行,即便是拥有多核CPU,开启了多线程,但是实际上只有一个线程执行。

所以相比于JAVA/C++并发加速要慢的多,这里需要提到的是在JAVA/C++中如果开启了多个线程多个线程将会同时执行,如果拥有多核CPU则会分布在多核CPU上并行执行。

为什么会产生GIL这个东西

简而言之,在设计者设计初期是为了规避并发问题引入的GIL,现在想去除却去除不掉了(在python的某一版本中是想将GIL去掉,但是发现程序运行速度更慢了)。

为了解决多线程之间数据完整性和状态同步问题。

原因详解:

 线程一对全局参数a进行修改,线程2则将a进行删除,导致线程1再次执行时程序崩溃,所以GIL保证了某段关键代码完整的执行。

 GIL的好处在于它简化了python多线程对于共享资源的管理。

怎样规避GIL带来的限制

1.多线程Threading 机制,用于I/O密集型处理,因为在I/O期间,线程回去释放GIL锁,实现CPU和I/O同时运行,因此多线程对于I/O密集型依然可以大幅度提升速度,相反如果用于CPU密集型则会大大的减少程序运行速度,因为只有一个CPU在运行。

2.为了使得python也可以将CPU多核资源利用上python提供了muiltprocessing的多进程机制,可以实现并行计算,利用CPU多核优势。使用 muiltprocessing 模块即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值