java和python哪个速度快,python为什么比java慢
Python很慢。这些是常见的原因:“因为它是GIL(全局解释器锁)”,“因为它是解释型语言而不是编译型语言”,“因为它是动态类型化语言”。
推荐课程:Java教程。
如何解决写爬虫IP受阻的问题?立即使用。
哪个原因对业绩影响最大?
“因为它是GIL”
现代计算机的CPU有多个核心,有时甚至是多个处理器。为了利用所有的计算能力,操作系统定义了一个叫做线程的底层结构,一个进程(比如Chrome浏览器)可以生成多个线程,通过线程执行系统指令。如果这样的进程需要使用大量的CPU,那么计算负载将由多个内核分担,最终将使大多数应用程序更快地完成任务。
在撰写本文时,我的Chrome浏览器有44个线程处于打开状态。此外,基于POSIX的操作系统(如Mac OS和Linux)的线程结构和API与Windows操作系统不同。操作系统还负责线程的调度。
如果你从来没有写过多线程程序,那么你应该知道锁的概念。与单线程进程不同,在多线程编程中,您应该确保在更改内存中的变量时,多个线程不会试图同时修改或访问同一个内存地址。
CPython在创建变量时分配内存,然后用计数器计算对变量的引用次数。这个概念被称为“引用计数”。如果引用数为0,则该变量可以从系统中释放。这样,创建“临时”变量(比如在for循环的上下文中)不会消耗应用程序的内存。
随之而来的问题是,如果多个线程共享变量,CPython需要锁定引用计数器。有一个“全局解释器锁”仔细控制线程的执行。不管有多少个线程,解释器一次只能执行一个操作。
这对Python应用程序的性能有什么影响?
如果应用程序是单线程、单解释器的,那么这对速度没有任何影响。移除GIL不会影响代码的性能。
但如果你想用一个解释器(一个Python进程)通过线程实现并发,而线程又是IO密集型的(也就是有很多网络I/O或者磁盘I/O),那么就会出现下面的GIL竞争:
如果一个Web应用程序(比如Django)使用WSGI,那么对Web应用程序的每个请求都将由一个独立的Python解释器执行,所以每个请求只有一个锁。因为Python解释器启动缓慢,所以一些WSGI实现支持“守护模式”来保持Python进程长时间运行。
“因为它是解释语言”
这个理由我听得多了,我发现它把CPython的实际工作原理过于简单化了。当你在终端上写python myscript.py时,CPython会启动一长串操作,包括读取、词法分析、语法分析、编译、解释和执行。这个过程的关键点在于,它会在编译阶段生成一个. pyc文件,字节码会被写入__pycache__/(如果是Python 3)下的文件中,或者和源代码在同一个目录下(Python 2)。不仅你写的脚本是这样,你导入的所有代码都是这样,包括第三方模块。
所以在大多数情况下(除非你写的代码只会运行一次),Python是在解释字节码,并在本地执行它们。请比较Java和C#。网络:
把Java源代码编译成“中间语言”,然后Java虚拟机读取字节码,瞬间编译成机器码。对于来说也是如此。NET CIL,其中公共语言运行库(CLR)的。NET使用实时编译将字节码编译成机器码。
那么,既然它们都使用虚拟机,和某种字节码,为什么Python在性能测试上比Java和C#慢那么多呢?第一个原因是。NET和Java都是即时编译(JIT)的。
准时制(Just-in-time)需要一种中间语言将代码分成小块(或小帧)。而提前(AOT)就是编译器在执行之前先把源代码翻译成CPU能理解的代码。
JIT本身并不能让执行更快,因为它执行的是同样的字节码序列。然而,JIT可以在运行时进行优化。一个好的GIT优化器可以找到应用程序执行最多的部分,也就是所谓的“热点”。然后优化那些字节码,用更高效的代码替换它们。
也就是说,如果你的应用程序会一遍又一遍地做某件事,那么速度会快很多。此外,不要忘记Java和C#都是强类型语言,所以优化器可以对代码做更多的假设。
“因为它是动态类型语言”
“静态类型”语言要求定义变量时必须指定变量的类型,如C、C、Java、C#和Go。
在动态类型化语言中,虽然也有类型的概念,但是变量的类型是动态的。
a=1
A=foo 。在这个例子中,Python定义了具有相同名称和str类型的第二个变量,同时释放了第一个。
静态类型语言不是为了折磨人而设计的,而是因为这是CPU的工作方式而设计的。如果任何操作最终都将被转换为简单的二进制操作,那么必须将对象和类型都转换为低级数据结构。
Python为你做了这一切,只不过你从来没有关心过,也不需要关心。
不需要定义类型并不是Python慢的原因。Python的设计允许你让一切动态化。您可以在运行时替换对象的方法,并在运行时修补底层系统调用。几乎一切皆有可能。
这种设计使得优化Python变得困难。
那么,Python的动态类型是不是让Python变慢了呢?
比较和转换类型的开销很大。每次读取、写入或引用字体变化时,都会检查类型。
动态语言很难优化。很多语言之所以快速替代Python,是因为牺牲了便利性来换取性能。
比如Cython (http://cython.org/),通过将C的静态类型与Python相结合,使得代码中的类型可知,从而优化了代码,实现了84倍的性能提升。
总结
Python慢的主要原因是因为它的动态性和多样性。可以用来解决各种问题,但是大多数问题都有更好更快的解决方法。
但是Python应用也有很多优化措施,比如使用异步,理解性能测试工具,使用多个解释器。
对于启动时间不重要,但代码可能享受JIT好处的应用程序,可以考虑使用PyPy。
对于性能很重要的那部分代码,如果变量大多是静态类型,可以考虑使用Cython。这就是为什么java比python快的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。