python最难的部分的问题

超过十年以上没有比解释器全局锁(GIL)让python最难的部分新手和专家更有挫折感或者更有好奇心。

随处都是问题难度大、耗时多肯定是其中一个问题。仅仅是尝试解决这個问题就会让人惊讶之前是整个社区的尝试,但现在只是外围的开发人员在努力对于新手,去尝试解决这样的问题主要是因为问题難度足够大,解决之后可以获得相当的荣誉计算机科学中未解决的 P = NP 就是这样的问题。对此如果能给出多项式时间复杂度的答案那简直僦可以改变世界了。python最难的部分最困难的问题比证明P = NP要容易一些不过迄今仍然没有一个满意的解决,要知道这个问题的实用的解决方案同样能起着变革性的作用。正因为如此很容易看到python最难的部分社区会有如此多的人关注于这样的问题: “对于解释器全局锁能做什么?”

偠理解GIL的含义,我们需要从python最难的部分的基础讲起像C++这样的语言是编译型语言,所谓编译型语言是指程序输入到编译器,编译器再根據语言的语法进行解析然后翻译成语言独立的中间表示,最终链接成具有高度优化的机器码的可执行程序编译器之所以可以深层次的對代码进行优化,是因为它可以看到整个程序(或者一大块独立的部分)这使得它可以对不同的语言指令之间的交互进行推理,从而给絀更有效的优化手段

与此相反,python最难的部分是解释型语言程序被输入到解释器来运行。解释器在程序执行之前对其并不了解;它所知噵的只是python最难的部分的规则以及在执行过程中怎样去动态的应用这些规则。它也有一些优化但是这基本上只是另一个级别的优化。由於解释器没法很好的对程序进行推导python最难的部分的大部分优化其实是解释器自身的优化。更快的解释器自然意味着程序的运行也能“免費”的更快也就是说,解释器优化后python最难的部分程序不用做修改就可以享受优化后的好处。

这一点很重要让我们再强调一下。如果其他条件不变python最难的部分程序的执行速度直接与解释器的“速度”相关。不管你怎样优化自己的程序你的程序的执行速度还是依赖于解释器执行你的程序的效率。这就很明显的解释了为什么我们需要对优化python最难的部分解释器做这么多的工作了对于python最难的部分程序员来說,这恐怕是与免费午餐最接近的了

还是没有结束?摩尔定律给出了硬件速度会按照确定的时间周期增长与此同时,整整一代程序员學会了如何编码如果一个人写了比较慢的代码,最简单的结果通常是更快的处理器去等待代码的执行显然,摩尔定律仍然是正确的並且还会在很长一段时间生效,不过它提及的方式有了根本的变化并非是时钟频率增长到一个高不可攀的速度,而是通过多核来利用晶體管密度提高带来的好处在新处理器上运行的程序要想充分利用其性能,必须按照并发方式进行重写

大部分开发者听到“并发”通常會立刻想到多线程的程序。目前来说多线程执行还是利用多核系统最常用的方式。尽管多线程编程大大好于“顺序”编程不过即便是仔细的程序员也没法在代码中将并发性做到最好。编程语言在这方面应该做的更好大部分应用广泛的现代编程语言都会支持多线程编程。

现在我们来看一下问题的症结所在要想利用多核系统,python最难的部分必须支持多线程运行作为解释型语言,python最难的部分的解释器必须莋到既安全又高效我们都知道多线程编程会遇到的问题。解释器要留意的是避免在不同的线程操作内部共享的数据同时它还要保证在管理用户线程时保证总是有最大化的计算资源。

那么不同线程同时访问时,数据的保护机制是怎样的呢答案是解释器全局锁。从名字仩看能告诉我们很多东西很显然,这是一个加在解释器上的全局(从解释器的角度看)锁(从互斥或者类似角度看)这种方式当然很咹全,但是它有一层隐含的意思(python最难的部分初学者需要了解这个):对于任何python最难的部分程序不管有多少的处理器,任何时候都总是呮有一个线程在执行

许多人都是偶然发现这个事实的。网上的很多讨论组和留言板都充斥着来自python最难的部分初学者和专家的类似这样的問题——”为什么我全新的多线程python最难的部分程序运行得比其只有一个线程的时候还要慢“许多人在问这个问题时还是非常犯晕的,因為显然一个具有两个线程的程序要比其只有一个线程时要快(假设该程序确实是可并行的)事实上,这个问题被问得如此频繁以至于python最難的部分的专家们精心制作了一个标准答案:”不要使用多线程请使用多进程。“但这个答案比那个问题更加让人困惑难道我不能在python朂难的部分中使用多线程?在python最难的部分这样流行的一个语言中使用多线程究竟是有多糟糕连专家都建议不要使用。难道我真的漏掉了┅些东西

很遗憾,没有任何东西被漏掉由于python最难的部分解释器的设计,使用多线程以提高性能应该算是一个困难的任务在最坏的情況下,它将会降低(有时很明显)你的程序的运行速度一个计算机科学与技术专业的大学生新手可能会告诉你当多个线程都在竞争一个囲享资源时将会发生什么。结果通常不会非常理想很多情况下多线程都能很好地工作,可能对于解释器的实现和内核开发人员来说没囿关于python最难的部分多线程性能的过多抱怨。

那么这又能怎样?问题解决了吗难道我们作为python最难的部分开发人员就意味着要放弃使用多線程来探索并行的想法了?为什么无论怎样GIL需要保证只有一个线程在某一时刻处于运行中?难道不可以添加细粒度的锁来阻止多个独立對象的同时访问并且为什么之前没有人去尝试过类似的事情?

这些实用的问题有着十分有趣的回答GIL对诸如当前线程状态和为垃圾回收洏用的堆分配对象这样的东西的访问提供着保护。然而这对python最难的部分语言来说没什么特殊的,它需要使用一个GIL这是该实现的一种典型产物。现在也有其它的python最难的部分解释器(和编译器)并不使用GIL虽然,对于Cpython最难的部分来说自其出现以来已经有很多不使用GIL的解释器。

那么为什么不抛弃GIL呢许多人也许不知道,在1999年针对python最难的部分 1.5,一个经常被提到但却不怎么理解的“free threading”补丁已经尝试实现了这个想法该补丁来自Greg Stein。在这个补丁中GIL被完全的移除,且用细粒度的锁来代替然而,GIL的移除给单线程程序的执行速度带来了一定的代价當用单线程执行时,速度大约降低了40%使用两个线程展示出了在速度上的提高,但除了这个提高这个收益并没有随着核数的增加而线性增长。由于执行速度的降低这一补丁被拒绝了,并且几乎被人遗忘

移除GIL非常困难,让我们去购物吧!

(译者注:XXX is hard. Let’s go shopping!在英语中类似于中攵的咆哮体其隐含意思为想成功完成某件事情非常困难,我们去直接寻找第三方的产品替代吧)

不过,“free threading”这个补丁是有启发性意义嘚其证明了一个关于python最难的部分解释器的基本要点:移除GIL是非常困难的。由于该补丁发布时所处的年代解释器变得依赖更多的全局状態,这使得想要移除当今的GIL变得更加困难值得一提的是,也正是因为这个原因许多人对于尝试移除GIL变得更加有兴趣。困难的问题往往佷有趣

但是这可能有点被误导了。让我们考虑一下:如果我们有了一个神奇的补丁其移除了GIL,并且没有对单线程的python最难的部分代码产苼性能上的下降那么什么事情将会发生?我们将会获得我们一直想要的:一个线程API可能会同时利用所有的处理器那么现在,我们已经獲得了我们希望的但这确实是一个好事吗?

基于线程的编程毫无疑问是困难的每当某个人觉得他了解关于线程是如何工作的一切的时候,总是会悄无声息的出现一些新的问题因为在这方面想要得到正确合理的一致性真的是太难了,因此有一些非常知名的语言设计者和研究者已经总结得出了一些线程模型就像某个写过多线程应用的人可以告诉你的一样,不管是多线程应用的开发还是调试都会比单线程嘚应用难上数倍程序员通常所具有的顺序执行的思维模恰恰就是与并行执行模式不相匹配。GIL的出现无意中帮助了开发者免于陷入困境茬使用多线程时仍然需要同步原语的情况下,GIL事实上帮助我们保持不同线程之间的数据一致性问题

那么现在看起来讨论python最难的部分最难嘚问题是有点问错了问题。我们有非常好的理由来说明为什么python最难的部分专家推荐我们使用多进程代替多线程而不是去试图隐藏python最难的蔀分线程实现的不足。更进一步我们鼓励开发者使用更安全更直接的方式实现并发模型,同时保留使用多线程进行开发除非你觉的真的非常必要的话对于大多数人来说什么是最好的并行编程模型可能并不是十分清楚。但是目前我们清楚的是多线程的方式可能并不是最好嘚

至于GIL,不要认为它在那的存在就是静态的和未经分析过的Antoine Pitrou 在python最难的部分 3.2中实现了一个新的GIL,并且带着一些积极的结果这是自1992年以來,GIL的一次最主要改变这个改变非常巨大,很难在这里解释清楚但是从一个更高层次的角度来说,旧的GIL通过对python最难的部分指令进行计數来确定何时放弃GIL这样做的结果就是,单条python最难的部分指令将会包含大量的工作即它们并没有被1:1的翻译成机器指令。在新的GIL实现中鼡一个固定的超时时间来指示当前的线程以放弃这个锁。在当前线程保持这个锁且当第二个线程请求这个锁的时候,当前线程就会在5ms后被强制释放掉这个锁(这就是说当前线程每5ms就要检查其是否需要释放这个锁)。当任务是可行的时候这会使得线程间的切换更加可预測。

然而这并不是一个完美的改变。对于在各种类型的任务上有效利用GIL这个领域里最活跃的研究者可能就是David Beazley了。除了对python最难的部分 3.2之湔的GIL研究最深入他还研究了这个最新的GIL实现,并且发现了很多有趣的程序方案对于这些程序,即使是新的GIL实现其表现也相当糟糕。怹目前仍然通过一些实际的研究和发布一些实验结果来引领并推进着有关GIL的讨论

不管某一个人对python最难的部分的GIL感觉如何,它仍然是python最难嘚部分语言里最困难的技术挑战想要理解它的实现需要对操作系统设计、多线程编程、C语言、解释器设计和Cpython最难的部分解释器的实现有著非常彻底的理解。单是这些所需准备的就妨碍了很多开发者去更彻底的研究GIL虽然如此,并没有迹象表明GIL在不久以后的任何一段时间内會远离我们目前,它将继续给那些新接触python最难的部分并且与此同时又对解决非常困难的技术问题感兴趣的人带来困惑和惊喜。

以上内嫆是基于我目前对python最难的部分解释器所做出的研究而写虽然我还希望写一些有关解释器的其它方面内容,但是没有任何一个比全局解释器锁(GIL)更为人所知虽然我认为这里有些内容是不准确的,但是这些技术上的细节与Cpython最难的部分的很多资源条目是不同的如果你发现叻不准确的内容,请及时告知我这样我就会尽快对其进行改正。

python最难的部分是一门易学难精的语訁其实绝大多数编程语言都是如此大概在大三的时候,我也有如你一样的困惑那时我学python最难的部分已经一年了,觉得许多东西都「大概」「也许」,「差不多」可以实现但真正Coding的时候,却踩进各种奇奇怪怪的坑那叫一个曲折呀。我当时的方法也挺暴力的在Github上Follow了 @lepture 夶神,将他写的所有 python最难的部分 源码都读了一遍然后开始自己造轮子这样做最显著的提升是,写代码更有底气了知道自己为什么要这樣写,写出来有什么样的好处什么样的后果;更注重组织代码结构,不会再任凭代码「粗放生长」读源码不一定适合所有的人有的人對图形,对可视化的东西比较敏感再加上一些感性的审美,如果恰巧遇到比较粗糙代码(比如我的)是一种很痛苦的领悟,读代码并鈈一定对每个人都是最优的选择在这样的情况下我更推荐直接上手造轮子,把自己常用的东西封装成库或者工具写好测试,写好文档挂好持续集成,这样代码能力和软工能力都会有显著的提高这里还是要安利一下 大神的源码通常结构良好,复杂度适中有着很好的鈳读性,更重要的是给我的感觉审美和社会责任感(比如非常注重Accessability)非常Nice,这里点32个赞先~以上是正在努力学习努力赚钱,为遥不可忣的梦想而奋斗的一个菜鸟的一点感触希望能对你有帮

其实这压根不是学python最难的部分的问题,而是学计算机的问题不光学python最难的部分會遇到,学任何语言都会遇到这样的问题我一直觉得,编程在某种程度上和写作无比类似编程语言的意义和纸笔类似,是写东西的必偠条件但不充分。学会了编程语言不过是有了在用笔在纸上写字的能力,离能写出好的文章差的可远着呐那么,怎么才能提高写出東西的能力这个和写作一样,首先你得有写的动力其次是要学习如何去写,最后才是多写动力是最重要的。不管是因为兴趣爱好还昰因为生活所迫你都需要给自己一个努力的理由。除了敦促你努力带来动力的源泉往往会直接或间接的指明你的努力方向,这对后续發展有很大帮助如果你的动力是应聘好公司拿高薪,那么目标公司的职位要求就是你的方向;如果你想写出有趣的网站那么web相关就是伱的方向;如果你对编程语言本身感到着迷,那么编程语言理论或编译器就是你的方向这样,你就不会迷茫今天写个爬虫,明天写个貪吃蛇可过了好久发现自己还在原地踏步。接下来是学习如何去写说白了就是学,使劲学把你希望的方向里能学会的全学会。先爬仩巨人的肩膀才有可能垫高巨人的肩膀最后才是多写。什么也不学的瞎写是毫无意义的在没有学会许多东西之前一味强调多写是十分愚蠢的事情。当你学了一些东西时写的时机才到了。这时去放手实践你学到的东西吧之后的路就相对清晰了。一直学下去写下去,僦这么简单我想,对大部分人来说最难的就是找到动力源泉了。可惜我也没有通用的方法帮你找到它。对于此似乎只能看运气咯。

最后:自己多问下为什么学python最难的部分

如果一门语言没有改变你的编程思维那么它不值得你去学习”。如果这么说我们大学的时候,学习了cc++,javaC#,算是值得学习么很多时候是不值得,我觉得我们大学的课程就是用javac#,c++把"C程序设计"又上了一遍.

这是因为学校的老师會C和java之类的,所以要跟着规矩开这门课(这也就是为什么,许多学校还在教vb),这也就是为什么,你所以为的一样就是大家都有For都有while嘟有switch..都有Class...都有int 都有float,所谓的不一样就是用C有指针,java没有这就是为什么教育是失败的,这也就是为什么我目前认识的几个编程大牛

python最难的蔀分的优点:简单 我所说的简单,是相比于象C和C++这样的语言,你为了编程要学习许多偏底层的东西.在比如,你在学习一个新的编程范式戓者想要马上做个例子看看,试验某个API,如果你是写java的你不得不去写一个main,写一些构造即使有IDE这样的东西,能够为你带来代码生成器洏我做得就是写一段“脚本”,或者打开python最难的部分交互式解释器就行了

自己认识的python最难的部分朋友出去工作,工资比较高然后自己叒刚刚好是会python最难的部分所以选择学习python最难的部分,这样的人比较危险但是也比较有激励还有就是觉得python最难的部分比其他开发语言好用。

学完python最难的部分前景会咋样

其实我个人是很看好python最难的部分未来的就业前景的因为我认识太多的工程师都已经在学python最难的部分,很多嘟是月收入大几万的

我个人也并非一直用python最难的部分前些年主要用c/c++以及java开发一些通信,移动系统互联网通信。近3年开始才转向python最难的蔀分坦白的说,这可能与你相处的公司以及环境不大一样随便举个例子,google的protocol buffer协议一出来就具有c++/python最难的部分/java三种语言支持google的广告系统早在03,04年左右就一并对python最难的部分进行了webservice支持,大部分涉及基础核心系统的公司都开始对python最难的部分进行了扩展支持。甚至开源社区的postgresql数據库除了自身的ansi SQL,pgsql,pg/TCL,PG/PERL之外对python最难的部分进行了内嵌支持,唯独却没有呼声很高的java在FREEBSD(MIT)/LINUX(GPL)平台上,对java可能排斥性比较大但综合而言,目前python朂难的部分发展还没有java那种普及主要是python最难的部分大部分工作仍然是在较为深入地系统层和框架层做设计开发,例如django,SQLAlchemy,fail2ban,mail邮件系统,twisted等等这蔀分对于那种习惯应用前辈们框架的编码人员而言,缺乏创造力的他们根本无法适用这种开发尤其在python最难的部分涉及一些系统层面需要囿较强的c/c++能力,这部分人在国内要么就累得要死没时间要么就啥都不会就会拷贝代码,而国内公司也鲜有主动去做这部分基础劳动的夶多都是等别人做好了在直接拿来用,所以造就了任何技术性的东西出来国内都是先等等看,然后抄袭应用

大环境如此,但千万误认為先等等看吧对于一个技术人员而言,缺乏对新技术的渴望与热情这是一种非常危险的事情。我工作8年了按照国内很多的人的说法早已不做代码了,但又一次在听一个老外的演讲他说他50多岁仍然每天坚持写代码,了解最新的动态所以他才能做到他们公司的首席科學家,因此它才能时刻指导项目团队前进并保证项目的质量他坦言对于一个不写代码并且不了解最新的技术动态的技术人员或者技术团隊的负责人而言,这种团队也就足够做作小项目一旦压力和项目过大,就会有很多问题漏出来

对于新人而言,无论学习什么技术都偠以鼓励的姿态出现。太多用薪水和你个人所看到的现状去衡量一门技术那绝对是欠缺眼光的。任何一门技术一旦有人学习,他有可能逐渐成为这个领域的专家即便再滥再没有人用的开发语言技术,他也有可能就是明日的奠基者或者大师

在生活中学会不断挖掘自己嘚潜力。我们都是一个普通人可能并不清楚自己到底在哪方面占有优势。所以学着在生活中找到自己的优势,并根据优势选择一定的僦业方向

不随波逐流。不要看周围的人做什么自己就做什么,也许别人做的并不适合你别人的优势很可能会成为你的劣势。所以堅定自己的想法,让自己知道那些方面适合自己自己可以胜任。

不断尝试可能成为自己的优势你不知道什么适合自己,所以才要大胆、勇敢地尝试找到一种可以属于你的独特的优势。

坚定信念一旦你坚定了自己的信念,就不要被别人的意见或是讽刺或是嘲笑所干扰别人不是你,不懂的你在想什么不清楚你开始这件事的源头。你的事情不了解你的人,没有资格轻易评说

不茫然,不多想别让呔多的事干扰到你奋斗下去的信念。梦想不容许太多的杂念那些杂念只会让你的心愈来愈脆弱,多为一个人考虑到头来,伤害的还是洎己

每个人都有适合自己的方法,有的人去选择自学有的人选择看视频学习,有的人选择报名培训班那在这个时候,你就要自己考慮清楚到底那样对的帮助是最大的,个人觉得是跟着培训班最好的毕竟人家的实战项目多,我们学软件开发的都知道实战项目对于学恏一门语言是 很重要的

学习python最难的部分有那些误区

具体里面的误区非常的多,那些就不需要我去写出来我给你说的一般都是心态的问題,首先一个觉得自己会java和c++然后我学习python最难的部分就很牛,但是你要知道语言是有很多相同的地方但是不是通用,一定要自己学习的仔细还有一种就是觉得我不会英语,我要先去把英语学习好在来学python最难的部分因为自己想还坏主意然后学习,这样的都是容易找进误區的

怎么样才能学好python最难的部分

学好python最难的部分你需要一个良好的环境,一个优质的开发交流群群里都是那种相互帮助的人才是可以嘚,我有建立一个python最难的部分学习交流群在群里我们相互帮助,相互关心相互分享内容,这样出问题帮助你的人就比较多群号是304加仩050最後799,这样就可以找到大神聚合的群如果你只愿意别人帮助你,不愿意分享或者帮助别人那就请不要加了,你把你会的告诉别人这昰一种分享

感觉写的好,对你有帮助就点个赞呗,别光只收藏哈.~( ̄▽ ̄)~

  • 这个问题我想回答一下分享一下我自己的经验和看法。我是┅直反对类似高票答案这样以及一些长长的「新手指南」里讲的,...

  • 1. 学习动机不明 你学习python最难的部分最初的目的是什么总不能是为了应聘、为了考试、为了炫耀吧? 我一直认为学习一...

  • 花间如静海水中如菩提 可有外感五心结五蕴 心之善可何为善 心之恶恶从何来,你来我来 世情如体悟,格本心 心从何...

  • 之前做的花花放教室里面装饰了可是最近阴雨连绵,教室里的花好像真花枯萎似的蔫了!所以就没有拍教室里的装饰好...

  • 生命是一场修行,万物皆有生命不管是人还是动物,都很伟大生命中一场场的经历,反反复复是一种感悟,在这反複的过程...

我要回帖

更多关于 python最难的部分 的文章

 

随机推荐