今天的python培训想和大家分享一下python编程语言慢的原因,让大家采取一些措施避免其缺陷,希望对大家有所帮助!
近年来Python语言开始流行。它广泛应用于网络开发和运营、数据科学、网络开发和网络安全问题。
但是Python在速度上完全没有优势。
Java在速度上与C、C++、C#或Python相比如何?答案几乎完全取决于要运行的应用程序。在这个问题上,没有完美的判断标准,但计算机语言基准SGAME是一个很好的方法。
根据我十几年对《计算机语言词典》的观察,与Java、C#、Go、JavaScript、C++等相比,Python是最慢的语言之一。这些包括JIT(C#,Java)和AOT(C,C++)编译器,以及解释语言如JavaScript。
注意:我说的“Python”,是指官方解释器CPython。在本文中,我还将提到其他解释器。
我想回答的问题是:为什么Python在运行同一个程序时比其他语言慢2到10倍?为什么我们不能让它更快?
主要原因如下:
"这是GIL(全球解释者洛克)"
“它是一种解释性语言,而不是汇编语言”
“它是一种动态类型语言”
那么以上哪个原因对性能影响最大呢?
“这是一个全局解释器锁”
现代计算机的CPU通常是多核的,有的有多个处理器。为了充分利用冗余的处理能力,操作系统定义了一个称为线程的低级结构:一个进程(比如Chrome浏览器)可以生成多个线程,并引导内部系统。
如果一个进程是CPU密集型的,那么它的负载可以由多个内核同时处理,从而有效地提高了大多数应用的速度。
写这篇文章的时候,我的Chrome浏览器同时有44个线程。注意基于POSIX(如MacOS、Linux)的线程的结构和API与Windows操作系统相比是不同的。操作系统还处理线程的调度。
如果之前没有做过多线程编程,需要快速熟悉锁的概念。与单线程进程不同,您需要确保当内存中的变量被修改时,多个线程不会试图同时访问或更改同一个内存地址。
CPython创建一个变量时,预先分配存储空间,然后计算当前变量的引用号。这个概念叫做引用计数。如果参考计数为零,它将从系统中释放相应的存储区域。
这就是为什么在CPython中创建“临时”变量不会使应用程序占用大量存储空间——尤其是当应用程序使用for循环等结构时,这可能会创建大量“临时”变量。
当有多个线程调用变量时,锁定引用计数对CPython来说是一个挑战。而“全局解释锁”就应运而生了,它可以细致地控制线程的执行。不管有多少线程,解释器一次只能执行一个操作。