您现在所在位置: 首页 > 睿道新闻

python编程培训你要知道python的性能意味着什么

发布时间:2020-09-16点击数:


  如果你的应用是基于单线程和单解释器的,讨论速度是没有意义的,因为去掉GIL不会影响代码性能。


  如果您想在单个解释器(Python进程)中使用线程来实现并发,并且您的线程是IO密集型的(如网络IO或磁盘IO),您将看到GIL争用的结果。


  如果您有一个web应用程序(比如Django)并且使用WSGI,那么您的web应用程序的每个请求都将是一个独立的Python解释器,所以每个请求只有一个锁。因为Python解释器启动慢,一些WSGI集成了可以保持Python进程的“守护进程”。


  其他Python解释器的速度呢?


  PyPy拥有GIL,通常比CPython至少快三倍。


  Jython没有GIL,因为在Jython中Python线程由Java线程表示,这要归功于JVM内存管理系统。


  JavaScript是怎么做到的?


  首先,所有的Javascript引擎都使用标记和清除的垃圾收集系统,而前面提到的GIL的基本需求是CPython的存储管理算法。


  JavaScript没有GIL,但是因为它是单线程的,所以也不需要GIL。


  JavaScript通过事件循环和提交/回调模式实现异步编程的并发。Python有一个类似异步事件循环的过程。


  “因为是解释性语言”


  经常听到这句话。我认为这只是对CPython实际工作原理的简单解释。如果在终端输入pythonmyscript.py,CPython会开始对这段代码进行一系列的读取、词法分析、解析、编译、解释和运行。


  这个过程中很重要的一步就是在编译阶段创建一个.pyc文件,这个字节码序列会被写到Python3下的__pycache__/路径中的一个文件中(对于Python2,文件路径是一样的)。此步骤不仅适用于脚本文件,还适用于所有导入的代码,包括第三方模块。


  所以大多数时候(除非你写的代码只运行一次),Python是在解释字节码,并在本地执行。我们来对比一下Java和C#。NET:


  Java编译成“中间语言”,然后Java虚拟机读取字节码,立即编译成机器码。。CIL的通用中间语言。NET也是一样,它的公共语言运行库(CLR)也是通过即时编译翻译成机器码的。


  那么,如果Python使用和Java、C#一样的虚拟机和一些字节码,为什么在基准测试中会慢很多呢?首先,。NET和Java都是用JIT编译的。


  JIT,也称为即时编译,需要一种中间语言来将代码分成块(或数据帧)。预编译器(AOT)的设计确保了CPU在交互之前能够理解每一行代码。


  JIT本身并没有使执行更快,因为它仍然执行相同的字节码序列。但是,JIT允许在运行时进行优化。一个好的JIT优化器可以检测哪些部分执行的更频繁,这些部分被称为“热点”。然后,它会用更高效的代码替换它们来完成优化。


  这意味着当一个计算机应用程序需要重复做一件事时,速度会更快。另外,我们需要知道Java和C#都是强类型语言(变量需要预定义),这样优化器就可以对代码做更多的假设。



  • 友情链接

关注东软睿道公众号了解更多IT行业资讯

添加东小萌微信
获取更多IT学习资源