与 Python 之父聊天:更快的 Python!
Python猫注: 在今年 5 月的 Python 语言峰会上,Guido van Rossum 作了一场《Making CPython Faster》的分享(材料在此),宣告他加入了激动人心的“香农计划”,旨在 4 年内提升 Python 性能至 5 倍。近日,Guido 上了一档英文播客节目(时长 30 分钟),谈论了他正在做的与高性能相关的工作,解答了几个问题。播客作者整理了一份内容纪要,本文是对该纪要的翻译。注:文末有音频及文稿下载
作者:Software at Scale
译者:豌豆花下猫@Python猫
原文:https://www.softwareatscale.dev/p/software-at-scale-34-faster-python
1、为什么你会对研究 Python 的性能感兴趣?
Guido:在某种意义上,它对我来说是一个相对舒服的话题,因为这意味着与 Python 的核心打交道,而我对这方面还算熟悉。当我在微软工作时,我曾短暂地关注过 Azure,但我意识到我在谷歌或 Dropbox 时就不喜欢这类工作。然后我关注了机器学习,但这需要花很多时间来做一些与 Python 无关的事情,甚至它与 Python 相关的部分就很少。
2、Mark Shannon 关于 Python 性能的那些想法有何不同,怎么能说服你去实现它们的呢?
Guido:我喜欢他思考问题的方式。大多数其它聚焦于 Python 性能的方法,如 PyPy 和 Cinder,并不适用于所有的使用场景,因为它们不能向后兼容扩展模块。Mark 具有 CPython 开发者的视角和经验,并且有一种可行的方法来维持向后兼容性,这是最难解决的问题。Python 的字节码解释器经常要在小版本之间(例如 3.8→3.9)进行修改,原因有很多,比如新的操作码,所以修改它是一种相对安全的方案。
3、你能给我们解释一下 Python 解释器的分层执行的概念么?
Guido:当执行一个程序时,你不知道它会在运行了几分之一毫秒后崩溃,还是会持续运行三周时间。因为对于同一份代码,在第一种情况下,它可能触发了一个 bug。如果运行程序需要三周时间,也许提前半小时优化所有待运行的代码是有意义的。
但很明显,特别是在像 Python 这样的动态语言中,我们尽可能多地做,而不要求用户告诉我们他们到底需要怎么做,你只是想尽快开始执行代码。所以,如果有一个小脚本,或者一个大程序,它碰巧执行失败了或者因为某些原因提前退出了,你就不用花费时间去优化全部的代码了。
所以,我们要做的就是保持字节码编译器的简单化,以便能尽快地开始执行代码。如果有某些函数被多次执行,那么我们就称其为 hot 函数。“hot”存在多种定义。在某些情况下,如果一个函数被调用超过一次,或者超过两次,或者超过 10 次,那么它被定义成一个热门函数。而在其它保守的情况下,你可能说“只有被调用 1000 次才算 hot”。
然后,当参数的类型是某些特定类型时,专门化的自适应编译器(PEP-659 Specializing Adaptive Compiler)会尝试用更快的字节码来替换某些字节码。一个简单的假想的例子是 Python 中的加号运算符,它可以令很多对象相加,比如整数、字符串、列表,甚至元组。但是,你不能将整数与字符串相加。
因此,优化的方法就是提供一个单独的“两个整数相加”的字节码,它是一个对用户隐藏的第二层字节码。(“优化”通常被称为加速 quickening,但一般在我们的语境中,我们称之为专门化 specializing)。这个操作码假设它的两个参数都是真正的 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 在分支预测和内联缓存方面做了什么,因为这就像是魔法一般。
完整内容
以上就是播客节目纪要的翻译。更多完整的对话内容,以及对话音频,我已保存好了。你如果感兴趣的话,请在 Python猫 公众号里发送数字“1030”,即可获取下载链接。
与 Python 之父聊天:更快的 Python!的更多相关文章
- 如何让python程序运行得更快
原则1:不优化 原则2:不要优化那些不重要的部分(否则会降低可读性) 解决方案: 1. 使用函数,局部变量比全局变量快很多.尽量使用函数,如main() 2. 有选择性的消除属性访问. 如多用 fro ...
- Python多线程和多进程谁更快?
python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...
- Python猫荐书系列之五:Python高性能编程
稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资…… 对于编程语言的争论,就是猿界的生 ...
- Python猫荐书系列之七:Python入门书籍有哪些?
本文原创并首发于公众号[Python猫],未经授权,请勿转载. 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python ...
- Python 3.12 目标:还可以更快!
按照发布计划,Python 3.11.0 将于 2022 年 10 月 24 日发布. 据测试,3.11 相比于 3.10,将会有 10-60% 的性能提升,这个成果主要归功于"Faster ...
- 让Python代码更快运行的 5 种方法
不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和 ...
- 比Python、Java更快的 Go 语言,能否称霸江湖?
关注之后加星标,江湖要事早知道 文章来源:jb51.net 有一种语言堪称比语言排行榜前五热门选手的Python.Java更快,它就是GO语言. Go于2009年11月正式宣布推出,成为开放源代码 ...
- 正则表达式匹配可以更快更简单 (but is slow in Java, Perl, PHP, Python, Ruby, ...)
source: https://swtch.com/~rsc/regexp/regexp1.html translated by trav, travmymail@gmail.com 引言 下图是两种 ...
- Python 小试牛刀,Django详细解读,让你更快的掌握它!!!
一.MVC和MTV模式 MVC:将web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的对象(ORM),视图负责与用户的交 ...
随机推荐
- [第十篇]——Docker 容器连接之Spring Cloud直播商城 b2b2c电子商务技术总结
Docker 容器连接 前面我们实现了通过网络端口来访问运行在 docker 容器内的服务. 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射. ...
- 修改statefulset 有些不允许直接修改
1.比如修改一个storageClassName: hostpath 会报错 意思是除了 'replicas', 'template', 'updateStrategy' 其他部分都是不可以 ...
- 图论---最小生成树----普利姆(Prim)算法
普利姆(Prim)算法 1. 最小生成树(又名:最小权重生成树) 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一 ...
- 计算机网络 -- TCP/IP
画图标准 OSI七层模型 7.应用层 作用:为用户提供软件/接口/界面 interface 协议:OICQ.HTTP.HTTPS.BT/P2P 6.表示层 作用:用于对用户数据进行数据呈现.(数据格式 ...
- PHP中的一些杂项函数学习
今天来学习的这些杂项函数在官方文档中都是放在一个杂项扩展中的,其实这些函数都并不是什么什么特别的扩展,也不需要安装什么东西就可以使用,它们就是一些简单的功能函数而已.当然,其中不少内容也是我们经常会使 ...
- 【PHP数据结构】栈和队列的应用
通过栈和队列的学习,我们似乎会感觉到其实数据结构还是非常简单的嘛.当然,这只是一个开始,我们从顺序表.链表开始,到现在的栈和队列,其实都是为了将来在铺路.在树和图的遍历算法中,都可以见到栈和队列的身影 ...
- git tag标签
列出标签 # 默认按字母排序显示 $ git tag # 模糊匹配查找标签 $ git tag -l "v2.8.5*" 创建标签 # 创建附注标签 $ git tag -a v1 ...
- Shell系列(1)- Shell概述
Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动.挂起.停止甚至时编写一些程序 Shell还是一个功能 ...
- 🤩全套Java教程_Java基础入门教程,零基础小白自学Java必备教程👻002 # 第二单元 常量,变量,数据类型 #
一.本单元知识点概述 二.本单元目标 (Ⅰ)重点知识目标 1.定义出各种数据类型的变量2.理解自动类型提升3.理解强制类型转换 (Ⅱ)能力目标 1.能够定义出所有类型的常量 2.理解Java中的基本数 ...
- GUI编程笔记
GUI编程 告诉大家该怎么学? 这是什么? 它怎么玩? 该如何去我们平时运用? 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1.简介 GUi的核心技术:Sw ...