如果大家有研究过python编程开发语言的话会发现,在一些特殊场景环境下,python程序运行是比较慢的,下面我们就一起来了解一下,引起这个问题的原因都有哪些。
是全局解释器锁的原因吗?
现在很多计算机都配备了具有多个核的CPU,有时甚至还会有多个处理器。为了更充分利用它们的处理能力,操作系统定义了一个称为线程的低级结构。某一个进程(例如Chrome浏览器)可以建立多个线程,在系统内执行不同的操作。在这种情况下,CPU密集型进程就可以跨核心分担负载了,这样的做法可以大大提高应用程序的运行效率。
如果你还没有写过多线程执行的代码,你就需要了解一下线程锁的概念了。多线程进程比单线程进程更为复杂,是因为需要使用线程锁来确保同一个内存地址中的数据不会被多个线程同时访问或更改。
CPython解释器在创建变量时,先会分配内存,然后对该变量的引用进行计数,这称为引用计数referencecounting。如果变量的引用数变为0,这个变量就会从内存中释放掉。这就是在for循环代码块内创建临时变量不会增加内存消耗的原因。
而当多个线程内共享一个变量时,CPython锁定引用计数的关键就在于使用了GIL,它会谨慎地控制线程的执行情况,无论同时存在多少个线程,解释器每次只允许一个线程进行操作。
这会对Python程序的性能有什么影响?
如果你的程序只有单线程、单进程,代码的速度和性能不会受到全局解释器锁的影响。
但如果你通过在单进程中使用多线程实现并发,并且是IO密集型(例如网络IO或磁盘IO)的线程,GIL竞争的效果就很明显了。
对于一个web应用(例如Djang