武汉PHP培训
达内武汉民大中心

15827352908

热门课程

最火的Python,一些令人头疼的问题!

  • 时间:2017-10-23 17:57
  • 发布:武汉PHP培训
  • 来源:PHP教程

Python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,很多人会发现使用多线程来改进自己的Python代码后,程序的运行效率却下降了。这篇文章对Python中的全局解释锁(GIL)进行了介绍。作者认为这是Python中最令人头疼的问题。

十年多年来,Python 的全局解释器锁(GIL)给新手和专家们带来了巨大的挫折感和好奇心。

悬而未决的问题

每个领域都会有这么一个问题:它难度大、耗时多,仅仅是尝试解决这个问题都会让人震惊。整个社区在很久以前就放弃了这个问题,现在只有少数人在努力试图解决它。对于初学者来说,解决这样高难度的问题,会给他带来足够的声誉。计算机科学领域中的 P = NP 就是这样的问题。如果能用多项式时间复杂度解决这个问题,那简直就可以改变世界了。Python 中最困难的问题比 P = NP 要容易一些,不过迄今仍然没有一个满意的答案,解决这个问题和解决 P = NP 问题一样具有革命性。正因为如此, Python 社区会有如此多的人关注于这个的问题: “对于全局解释器锁(GIL)能做什么?”

Python 的底层

要理解 GIL 的含义,我们需要从 Python 的基础说起。像 C++ 这样的语言属于编译型语言,顾名思义,该类型语言的代码输入到编译器,由编译器根据语言的语法进行解析,生成与语言无关的中间表示,最后链接成由高度优化的机器码组成的可执行程序。因为编译器可以获取全部代码(或者是一大段相对独立的代码),所以编译器可以对代码进行深度优化。这使得它可以对不同的语言结构之间的交互进行推理,从而做出更有效的优化。

相反,Python 是解释型语言。代码被输入到解释器来运行。解释器在执行之前对代码一无所知;它只知道 Python 的规则,以及如何在执行过程中动态地应用这些规则。它也有一些优化,但是和编译型语言的优化完全不同。由于解释器不能很好地对代码进行推导,Python 的大部分优化其实是解释器本身的优化。更快的解释器自然意味着更快的程序运行速度,而这种优化对开发者来说是免费的。也就是说,解释器优化后,开发者不用修改 Python 代码就可以坐享优化带来的好处。

这是非常重要的一点,这里有必要在强调一下。在同等条件下,Python 程序的运行速度与解释器的“速度”直接相关相关。无论开发者怎样优化自己的代码,程序的执行速度还是受限于解释器的执行效率。很明显,这就是为什么做了如此多的工作去优化 Python 解释器。这大概是离 Python 开发者最近的免费的午餐。

免费午餐结束了

还是没有结束?摩尔定律告诉了我们硬件提速的时间表,同时,整整一代程序员学会了如何在摩尔定律下编写代码。如果程序员写了比较慢的代码,最简单的办法通常是稍稍等待一下更快的处理器问世即可。事实上,摩尔定律仍然是并且会在很长一段时间内是有效的,不过它生效的方式有了根本的变化。时钟频率不会稳定增长到一个高不可攀的速度,取而代之的是通过多核来利用晶体管密度提高带来的好处。想要程序能够充分利用新处理器的性能,就必须按照并发方式对代码进行重写。

大部分开发者听到“并发”通常会马上想到多线程程序。目前,多线程仍是利用多核系统最常见的方式。多线程编程比传统的“顺序”编程要难很多,不过仔细的程序员可以在代码中充分利用多线程的并发性。既然几乎所有应用广泛的现代编程语言都支持多线程编程,语言在多线程方面的实现应该是事后添加上去的。


马上预约七天免费试听课

姓名:

电话:

上一篇:教你完美解决php网站乱码,修复神器
下一篇:php难学吗?要学多久?

小白须知丨PHP开发规范

PHP初学者的最佳学习路径

选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊