Python猫注:在今年5月的Python语言峰会上,GuidovanRossum做了一个《Making CPython Faster》的分享(素材在这里),宣布加入了激动人心的“香农计划”,旨在4个改进Python一年内性能提升5倍。最近,Guido出现在一个英语播客(时长30分钟)中,谈到了他正在做的与高性能相关的工作,并回答了几个问题。播客的作者汇总了内容摘要,本文是对该摘要的翻译。注:文末有音频和手稿下载作者:SoftwareatScale译者:豌豆花夏猫@Python猫原文:https://www.softwareatscale.d...1.你为什么对学习感兴趣Python的性能?Guido:从某种意义上说,这对我来说是一个相对舒适的话题,因为它意味着处理我相当熟悉的Python核心。当我在微软工作时,我曾短暂地看过Azure,但意识到当我在谷歌或Dropbox时,我并不喜欢这种类型的工作。然后又看了看机器学习,但是花了不少时间做一些跟Python无关的,甚至和Python相关的也很少。2.MarkShannon关于Python性能的想法有何不同,它们如何说服您实施它们?Guido:我喜欢他思考问题的方式。大多数其他以性能为中心的Python方法,例如PyPy和Cinder,并不适合所有使用场景,因为它们不向后兼容扩展模块。Mark有CPython开发者的眼光和经验,有可行的方法来保持向后兼容,这是最难解决的问题。Python的字节码解释器经常会因为很多原因在小版本之间(比如3.8→3.9)进行修改,比如新的opcode,所以修改它是一个相对安全的方案。3.你能给我们解释一下Python解释器分层执行的概念吗?Guido:当你执行一个程序时,你不知道它是否会在零点几毫秒后崩溃,或者它是否会继续运行三个星期。因为同样的代码,在第一种情况下,可能会触发bug。如果运行该程序需要三周时间,那么将所有代码优化为提前半小时运行也许是有意义的。但显然,尤其是在像Python这样的动态语言中,我们尽量做到不要求用户确切地告诉我们他们需要做什么,你只想尽快开始执行代码。所以,如果你有一个小脚本,或者一个大程序,并且由于某种原因碰巧失败或提前退出,你不必花时间优化整个代码。所以,我们要做的就是让字节码编译器保持简单,这样我们就可以尽快开始执行代码。如果某些函数被执行了多次,那么我们就称它们为热函数。“热”有多种定义。在某些情况下,如果某个函数被调用超过一次、超过两次或超过10次,则该函数被定义为热函数。而在其他保守的情况下,你可能会说“只有被调用1000次才算热”。然后,当参数的类型是某种特定类型时,专门的自适应编译器(PEP-659SpecializingAdaptiveCompiler)将尝试用更快的字节码替换一些字节码。一个简单的假设示例是Python中的加号运算符,它可以添加许多对象,例如整数、字符串、列表,甚至元组。但是,您不能将整数添加到字符串中。因此,优化的方式是提供单独的“双整数相加”字节码,这是对用户隐藏的二级字节码。(“优化”通常称为加速,但通常在我们的上下文中我们将其称为专业化)。这个操作码假定它的两个参数都是真正的Python整数对象,直接读取那些对象的值,将它们添加到机器寄存器中,最后将结果推回堆栈。添加两个整数仍然需要对参数进行类型检查。所以它不是完全不受约束,但是这种类型检查比完全通用的面向对象的加操作实现起来要快得多。最后,一个函数有可能被整数参数调用数百万次,然后突然一小段代码用浮点参数调用它,或者更糟。此时解释器会直接执行原来的字节码。这是一个重要的部分,因此您始终可以获得完整的Python语义。Python猫注:“香农计划”的最终目标是对解释器的执行过程进行分层,针对不同层进行定制化优化。具体可以参考Github项目介绍(https://github.com/markshannon/faster-cpython/blob/master/tiers.md)。4、通常在谈到JIT(Just-In-Time)编译器时,你会听到这些技术,但Python官方还没有实现。Guido:即时编译方法有很多我们想要避免的情感包袱。例如,我们不确切地知道要编译什么以及什么时候编译。在程序开始执行之前,解释器先将源代码编译成字节码,再将字节码转换成专门的字节码。这意味着一切都发生在运行时的某个时刻,那么哪一部分是所谓的Just-In-Time?此外,人们通常认为JIT会自动使所有代码变得更好。不幸的是,您通常无法真正预测代码的性能。由于现代CPU及其神奇的分支预测,我们已经拥有足够的性能。例如,我们以一种我们认为会显着减少内存访问次数的方式编写了一段代码。然而,当我们对其进行基准测试时,我们发现它的运行速度与旧的未优化代码一样快,因为CPU在没有我们任何帮助的情况下找出了优化的访问模式。我希望我知道现代CPU如何处理分支预测和内联缓存,因为它就像魔法一样。以上是播客节目摘要的翻译。比较完整的对话内容,还有对话音频,我已经保存了。有兴趣的请发号码“1030”到Python猫公众号获取下载链接。
