java比python快的原因

  介绍

这篇文章给大家分享的是有关java比python快的原因的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

, python慢,这几种是常见的原因:“因为它是吉尔(全局解释器锁)”,“因为它是解释语言不是编译语言”,“因为它是动态类型语言”。

推荐课程:java教程。

究竟哪个原因对性能的影响最大?

<强>”因为它是吉尔”

现代计算机的CPU有多个核心,有时甚至有多个处理器。为了利用所有计算能力,操作系统定义了一个底层结构,叫做线程,而一个进程(例如铬浏览器)能够生成多个线程,通过线程来执行系统指令。这样如果一个进程是要使用很多CPU,那么计算负载就会由多个核心分担,最终使得绝大多数应用能更快地完成任务。

在撰写本文时,我的Chrome浏览器开了44个线程。另外,基于POSIX的操作系统(如Mac OS和Linux)的线程结构和API与Windows操作系统是不一样的。操作系统还负责线程的调度。

如果你没写过多线程程序,那么你应该了解一下锁的概念。与单线程进程不同,在多线程编程中,你要确保改变内存中的变量时,多个线程不会试图同时修改或访问同一个内存地址。

CPython在创建变量时会分配内存,然后用一个计数器计算对该变量的引用的次数。这个概念叫做“引用计数”。如果引用的数目为0,那就可以将这个变量从系统中释放掉。这样,创建“临时“变量(如在对循环的上下文环境中)不会耗光应用程序的内存。

随之而来的问题就是,如果变量在多个线程中共享,CPython的需要对引用计数器加锁,有一个“全局解释器锁”会谨慎地控制线程的执行。不管有多少个线程,解释器一次只能执行一个操作。

这对python应用的性能有什么影响?

如果应用程序是单线程,单解释器的,那么这不会对速度有任何影响。去掉吉尔也不会影响代码的性能。

但如果想用一个解释器(一个python进程)通过线程实现并发,而且线程是IO密集型的(即有很多网络输入输出或磁盘输入输出),那么就会出现下面这种吉尔竞争:

 java比python快的原因“> <br/> </p> <p>如果网络应用(如Django)使用了WSGI,那么发往网络应用的每个请求都会由独立的python解释器执行,因此每个请求都只会有一个锁,由于python解释器启动很慢,一些WSGI实现就支持“守护模式”,保持python进程长期运行。</p> <p> <强>”因为它是解释语言”</强> </p> <p>这条理由我也听过很多,我发现它过于简化了CPython的实际工作原理。当你在终端上写python myscript。py时,CPython会启动一长串操作,包括读,取词法分析,语法分析,编译,解释以及执行。个过程的重点就是它会在编译阶段生成。佩克文件,字节码会写到__pycache__/下的文件中(如果是Python 3),或者写到与源代码同一个目录中(Python 2)。不仅你编写的脚本是这样,所有你导入的代码都是这样,包括第三方模块。</p> <p>因此绝大多数情况下(除非你写的代码只会运行一次),Python是在解释字节码并在本地执行。与Java和c# . net比较一下:</p> <p> Java将源代码编译成“中间语言”,然后Java虚拟机读取字节码并即时编译成机器码. .净CIL也是一样的,. NET的公共语言运行时(CLR)使用即时编译将字节码编译成机器码。</p> <p>那么,既然它们都使用虚拟机,以及某种字节码,为什么Python在性能测试中比Java和c#慢那么多?第一个原因是,。净和Java是即时编译的(JIT)。</p> <p>即时编译,即JIT(及时),需要一种中间语言,将代码分割成小块(或者称帧)。而提前编译(提前,简称AOT)是编译器把源代码翻译成CPU能理解的代码之后再执行。</p> <p> JIT本身并不能让执行更快,因为它执行的是同样的字节码序列。但是,JIT可以在运行时做出优化。好的GIT优化器能找到应用程序中执行最多的部分,称为“热点”。然后对那些字节码进行优化,将它们替换成效率更高的代码。</p> <p>这就是说,如果你的应用程序会反复做某件事情,那么速度就会快很多。此外,别忘了Java和c#都是强类型语言,所以优化器可以对代码做更多的假设。</p> <p> <强>”因为它是动态类型语言”</强> </p> <p>“静态类型”语言要求必须在变量定义时指定其类型,例如C、c++、Java、c#和等。</p> <p>而动态类型语言中尽管也有类型的概念,但变量的类型是动态的。</p> <pre类==1   a=癴oo"

在这个例子中,Python用相同的名字和str类型定义了第二个变量,同时释放了第一个一个的实例占用的内存。

java比python快的原因