文章目录
- 1.python程序提速大的方法
- 2.Python对并发编程的支持
- 3.CPU密集型计算、IO密集型计算?
- 4.多线程、多进程、多协程的对比
- 5.Python速度慢的两大原因
- 6.GIL
1.python程序提速大的方法
- python多线程并发 VS python多CPU并行
2.Python对并发编程的支持
- 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成
- 多进程:multiprocessing,利用多核CPU的能力,真正的并行执行任务
- 异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
- 使用Lock对资源加锁,防止冲突访问
- 使用Queue实现不同线程/进程之间的数据通信,实现生产者-消费者模式
- 使用线程池Pool/进程池Pool,简化线程/进程的任务提交、等待结束、获取结果
- 使用subprocess启动外部程序的进程,并进行输入输出交互
- Python并发编程有三种方式
多线程Thread、多进程Process、多协程Coroutine
3.CPU密集型计算、IO密集型计算?
- CPU密集型(CPU-bound):Bound表示受限制的意思;
CPU密集型(CPU-bound):
Bound表示受限制的意思
(1)CPU密集型也叫计算密集型,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高
(2)例如:压缩解压缩、加密解密、正则表达式搜索 - IO密集型(I/O bound):
(1)IO密集型指的是系统运作大部分的状况是CPU在等I/O (硬盘/内存/网络) 的读/写操作,CPU占用率仍然较低。
(2)例如:文件处理程序、网络爬虫程序、读写数据库程序
4.多线程、多进程、多协程的对比
- 怎样根据任务选择对应技术?
5.Python速度慢的两大原因
- Python 速度慢的原因1
动态类型语言
边解释边执行
由于速度慢的原因,很多公司的基础架构代码依然用C/C++开发:从源码翻译成机器码,机器码速度快,比如各大公司阿里/腾讯/快手的推荐引擎、搜索引擎、存储引擎等底层对性能要求高的模块 - Python 速度慢的原因2
GIL
导致无法利用多核CPU并发执行
6.GIL
- 全局解释器锁(英语:Global Interpreter Lock,缩写GIL)
是计算机程序设计语言解释器用于同步线程的一种机制,它使得任何时刻仅有一个线程在执行。
即便在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程。 - 由于GIL的存在,即使电脑有多核CPU,单个时刻也只能使用1个,相比并发加速的C++/JAVA所以慢,C++/JAVA的多线程程序会分配到多核上去执行
- 为什么有GIL这个东西?
为了解决多线程之间数据完整性和状态同步问题
GIL确实有好处:简化了Python对共享资源的管理;
原因如下:Python中对象的管理,是使用引用计数器进行的,引用数为0则释放对象
开始:线程A和线程B都引用了对象obj,obj.ref_num = 2,线程A和B都想撤销对obj的引用 - 怎样规避GIL带来的限制?
(1)多线程 threading 机制依然是有用的,用于IO密集型计算
因为在 I/O (read,write,send,recv,etc.)期间,线程会释放GIL,实现CPU和IO的并行,因此多线程用于IO密集型计算依然可以大幅提升速度;
但是多线程用于CPU密集型计算时,只会更加拖慢速度;
(2)使用multiprocessing 的多进程机制实现并行计算、利用多核CPU优势
为了应对GIL的问题,Python提供了multiprocessing - 参考:链接