这篇文章给大家分享的是有关java比python快的原因的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
, python慢,这几种是常见的原因:“因为它是吉尔(全局解释器锁)”,“因为它是解释语言不是编译语言”,“因为它是动态类型语言”。
推荐课程:java教程。
究竟哪个原因对性能的影响最大?
<强>”因为它是吉尔”强>
现代计算机的CPU有多个核心,有时甚至有多个处理器。为了利用所有计算能力,操作系统定义了一个底层结构,叫做线程,而一个进程(例如铬浏览器)能够生成多个线程,通过线程来执行系统指令。这样如果一个进程是要使用很多CPU,那么计算负载就会由多个核心分担,最终使得绝大多数应用能更快地完成任务。
在撰写本文时,我的Chrome浏览器开了44个线程。另外,基于POSIX的操作系统(如Mac OS和Linux)的线程结构和API与Windows操作系统是不一样的。操作系统还负责线程的调度。
如果你没写过多线程程序,那么你应该了解一下锁的概念。与单线程进程不同,在多线程编程中,你要确保改变内存中的变量时,多个线程不会试图同时修改或访问同一个内存地址。
CPython在创建变量时会分配内存,然后用一个计数器计算对该变量的引用的次数。这个概念叫做“引用计数”。如果引用的数目为0,那就可以将这个变量从系统中释放掉。这样,创建“临时“变量(如在对循环的上下文环境中)不会耗光应用程序的内存。
随之而来的问题就是,如果变量在多个线程中共享,CPython的需要对引用计数器加锁,有一个“全局解释器锁”会谨慎地控制线程的执行。不管有多少个线程,解释器一次只能执行一个操作。
这对python应用的性能有什么影响?
如果应用程序是单线程,单解释器的,那么这不会对速度有任何影响。去掉吉尔也不会影响代码的性能。
但如果想用一个解释器(一个python进程)通过线程实现并发,而且线程是IO密集型的(即有很多网络输入输出或磁盘输入输出),那么就会出现下面这种吉尔竞争:
=1 a=癴oo"
在这个例子中,Python用相同的名字和str类型定义了第二个变量,同时释放了第一个一个的实例占用的内存。