目录
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 模块即可。