Python 3.12 目标:还可以更快!
按照发布计划,Python 3.11.0 将于 2022 年 10 月 24 日发布。
据测试,3.11 相比于 3.10,将会有 10-60% 的性能提升,这个成果主要归功于“Faster CPython”项目,即“香农计划”。
关于“香农计划”的详情,可查看 Python 之父的主题分享,以及他的一则播客访谈。
3.11 版本为 Python 的提速开了一个激动人心的好头。接下来,3.12 还会有更多动作。
以下文章翻译自“香农计划”的《Python 3.12 Goals》,大家先一睹为快吧!
作者:Mark Shannon
译者:豌豆花下猫@Python猫
英文:https://github.com/faster-cpython/ideas/wiki/Python-3.12-Goals
本文内容可能会改动,以实际版本为准!
本文是 Faster CPython 计划在 3.12 中实现的主要内容的概要。
跟踪优化器
Python 3.11 提升速度的主要方法是用更快的与上下文相关的操作码(自适应的专门化操作码)替换个别的操作码,下一个大的改进方法是优化多个操作码的运行。
为此,现有的许多高级操作码将被替换成低级操作码,例如,用于检查版本号和引用计数的操作码。这些更简单的操作码更容易进行优化,例如,可以删除冗余的引用计数操作。
这些更底层的操作码还能让我们得到一组适合用于生成机器代码的指令(在 CPython 和第三方 JIT 项目中都适用)。
为了做到这点,解释器循环(interpreter loop)将基于声明性的描述而生成。
这可减少一部分为了保持解释器循环与某些相关函数同步而产生的 bug(mark_stacks、stack_effect 等函数),同时也让我们可以对解释器循环作较大的更改试验。
多线程并行
Python 当前每个进程有一个全局解释器锁(GIL),阻碍了多线程的并行。
PEP-684:https://peps.python.org/pep-0684
PEP-554:https://peps.python.org/pep-0554

PEP-684 提出了一个方案,即保证所有的全局状态都是线程安全的,并移动到每个子解释器的全局解释器锁中使用。

PEP-554 提出了让 Python 创建子解释器的方案(目前只是一个 C API 特性),从而实现真正的多线程并行。
Python猫注:PEP-554 早在 2017 年就提出了,目标是落地在 Python 3.8-3.9 版本,然而事与愿违。早在 2019 年的时候,我还翻译了一篇《Has the Python GIL been slain?》。屠刀已挥出,让它再飞一会~~
更多专门化
我们分析了哪些字节码将从专门化中获益最多,计划在 3.12 完成其余的高收益的改进。

较小的对象结构
有许多可以减少 Python 对象结构大小的机会。由于它们被频繁使用,这不仅有利于总体的内存使用,还有利于缓存的一致性。我们计划在 3.12 中实现最有希望的一些想法。
这里有一些向后兼容性与性能之间的权衡问题,可能需要提出一个 PEP 来建立共识。

减少内存管理的开销
我们不仅会减小对象的大小,还会使它们的 layout 更加规则。
这不仅能优化内存的分配及释放,还能在 GC 和重新分配期间加快遍历对象的速度。
API 稳定性
除了前述项目外,开发团队还将提升 CPython 代码库的整体质量:
- 通过减少不同编译阶段的耦合,使编译器更易于维护与测试。
- 积极地在 C 语言级别监控和改进 CPython 测试套的代码覆盖率。
- 改进 Python 性能基准测试套,加入更具代表性的现实世界的负载测试。
- 协助处理 CPython 问题和 PR,特别是与性能有关的问题。
- 增加用于标准基准测试的机器,增加 macOS 和 Windows 的测试结果。
- 继续跟主要的深度使用 Python 内核的项目合作,帮助它们适配 CPython 解释器的更改。
注:文中图片为译者所加。
首发于 Python猫 ,如需转载,请联系作者
知乎:Python猫
博客园:豌豆花下猫
掘金:豌豆花下猫
CSDN:Python猫
Python 3.12 目标:还可以更快!的更多相关文章
- Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型
Python 的 3.9.0 版本正在开发中,计划在 2020-10-05 发布 final 版本. 官方在 changelog 中披露了很多细节,其中有一项"vectorcall" ...
- 比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 之父聊天:更快的 Python!
Python猫注: 在今年 5 月的 Python 语言峰会上,Guido van Rossum 作了一场<Making CPython Faster>的分享(材料在此),宣告他加入了激动 ...
- 利用更快的r-cnn深度学习进行目标检测
此示例演示如何使用名为“更快r-cnn(具有卷积神经网络的区域)”的深度学习技术来训练对象探测器. 概述 此示例演示如何训练用于检测车辆的更快r-cnn对象探测器.更快的r-nnn [1]是r-cnn ...
- 让Python代码更快运行的 5 种方法
不论什么语言,我们都需要注意性能优化问题,提高执行效率.选择了脚本语言就要忍受其速度,这句话在某种程度上说明了Python作为脚本语言的不足之处,那就是执行效率和性能不够亮.尽管Python从未如C和 ...
- Python多线程和多进程谁更快?
python多进程和多线程谁更快 python3.6 threading和multiprocessing 四核+三星250G-850-SSD 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很 ...
- android开发者您还在为模拟器犯愁吗?神级android模拟器---Genymotion一个更快、接近完美的模拟器……
摘要:Android系统非常特别,App须要进行模拟化測试.即使这样仍然有解决的办法---虚拟化技术. 之前的模拟器比方eclipse自带的是非常慢的一种,并且模拟器的版本号并非最新的.开机.能够说差 ...
- 金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(实战篇)
本文作者:丁同舟,来自金蝶随手记技术团队. 1.前言 本文接上篇<金蝶随手记团队分享:还在用JSON? Protobuf让数据传输更省更快(原理篇)>,以iOS端的Objective-C代 ...
随机推荐
- Linux串口编程进阶
在<Linux串口编程>编程一文中介绍了串口应用中常用的基本操作,如:串口打开关闭.串口设置.数据收发等.本篇文章主要基于常规串口操作进行了扩充,主要介绍如下操作: Linux系统使用非标 ...
- break和continue语句的使用
break break关键字的用法有常见的两种: 1.可以用在switch语句当中,一旦执行整个switch语句like结束. 2.还可以用在循环语句当中,一旦执行,整个循环语句立刻结束,打断循环 关 ...
- 零基础学Java(13)方法参数
前言 首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语.按值调用表示方法接收的是调用者提供的值.而按引调用表示方法接收的是调用者提供的变量地址.方法可以修改按引用传递的变量的值,而不 ...
- LyScript 实现对内存堆栈扫描
LyScript插件中提供了三种基本的堆栈操作方法,其中push_stack用于入栈,pop_stack用于出栈,而最有用的是peek_stack函数,该函数可用于检查指定堆栈位置处的内存参数,利用这 ...
- 皮皮调度(1)——从Airflow到DolphinScheduler,以及“皮皮调度”的来历
按照前一篇文章 <GraalVM -- 让Java变得再次强大> 末尾提到的计划,本来这篇文章是想写一下GraalVM的后续<深耕云原生的Java应用框架 -- Quarkus> ...
- LuoguP1020 导弹拦截 (LIS)
最长不降和单升 #include <iostream> #include <cstdio> #include <cstring> #include <algo ...
- from表单、css选择器、css组合器、字体样式、背景属性、边框设置、display设置
目录 一.form表单 1.form表单功能 2.表单使用原理 二.前端基础之css 1.关于css的介绍 2.css语法 3.三种编写CSS的方式 3.1.style内部直接编写css代码 3.2. ...
- tqdm和zip组合使用时无法显示进度条-解决办法
问题 单独对于可迭代对象iterator使用tqdm时,结合循环就可以在终端显示进度条, 以直观展示程序进度,如下: from tqdm import tqdm textlist = [] for i ...
- [CF1527D] MEX Tree (lca)
题面 给你一棵 n n n 个结点的树,对于所有的 k ∈ [ 0 , n ] k\in[0,n] k∈[0,n] ,求出 M E X = k {\rm MEX}=k MEX=k 的路径数量. 一条路 ...
- JWT漏洞学习
JWT漏洞学习 什么是JWT? JWT是JSON Web Token的缩写,它是一串带有声明信息的字符串,由服务端使用加密算法对信息签名,以保证其完整性和不可伪造性.Token里可以包含所有必要的信息 ...