Python 3.11 有什么新变化

您所在的位置:网站首页 python3升级 Python 3.11 有什么新变化

Python 3.11 有什么新变化

2024-07-17 20:27| 来源: 网络整理| 查看: 265

PEP 659:专门化自适应解释器¶

PEP 659 是 Faster CPython 项目的关键部分之一。 基本理念在于虽然 Python 是一种动态语言,但大部分代码都存在对象和类型极少发生变化的区域。 这一理念被称为 类型稳定性。

在运行时,Python 将尝试在所执行的代码中寻找常见模式和类型稳定性。 然后 Python 将把当前的操作替换为更加专门化的操作。 这种专门化的操作使用仅对这些应用场景/类型来说可用的快速路径,它们的性能通常都会超过其泛用型的对应物。 这还带来了名为 内联缓存 的另一项理念,即 Python 会将高消耗的操作的结果直接缓存在 bytecode 中。

这个特化程序还会将特定的常见指令对合并为一条超级指令,减少执行期间的开销。

Python 将只特化(会被多次执行的)“热门”代码。 这可以防止 Python 在只执行一次的代码上浪费时间。 Python 还可以在代码过于动态或用法发生变化时取消特化。 特化会定期地尝试,而特化尝试的开销也不高,这使得特化能够适应新的环境改变。

(PEP 由 Mark Shannon 撰写,部分想法由 Stefan Brunthaler 提供。 请参阅 PEP 659 了解详情。 由 Mark Shannon 和 Brandt Bucher 实现,并由 Irit Katriel 和 Dennis Sweeney 提供了额外的帮助。)

运算

形式

专门化

运行加速(最高)

贡献者

双目运算

x + x

x - x

x * x

常见类型如 int, float 和 str 的双目加法、乘法和减法将采用针对其下层类型专门定制的快速路径。

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

下标

a[i]

对容器类型如 list, tuple 和 dict 的下标操作将直接索引下层数据结构。

对自定义 __getitem__() 的下标操作也是采用类似于 内联的 Python 函数调用 的内联方式。

10-25%

Irit Katriel, Mark Shannon

存储下标操作

a[i] = z

类似于上述的下标操作专门化。

10-25%

Dennis Sweeney

调用

f(arg)

C(arg)

对常用内置 (C) 函数和类型如 len() 和 str 的调用将直接调用其下层 C 版本。 这将避免经历内部调用流程。

20%

Mark Shannon, Ken Jin

加载全局变量

print

len

对象在全局/内置命名空间中的索引会被缓存。 加载全局和内置变量将不需要命名空间查找过程。

[1]

Mark Shannon

加载属性

o.attr

类似于加载全局变量。 属性在类/对象命名空间中的索引会被缓存。 在大多数情况下,加载属性将不需要命名空间查找过程。

[2]

Mark Shannon

加载要调用的方法

o.meth()

方法的实际地址会被缓存。 加载方法现在将不需要命名空间查找过程 -- 即使对于具有较长继承链的类来说也是如此。

10-20%

Ken Jin, Mark Shannon

存储属性

o.attr = z

类似于加载属性的优化。

2% 的运行效率

Mark Shannon

解包序列

*seq

针对常见容器如 list 和 tuple 进行了专门化。 避免内部调用流程。

8%

Brandt Bucher

[1]

类似的优化自 Python 3.8 起即已存在。 3.11 针对更多形式进行了专门化并减少了部分开销。

[2]

类似的优化自 Python 3.10 起即已存在。 3.11 针对更多形式进行了专门化。 此外,所有属性加载都应当通过 bpo-45947 获得了加速。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3