Python 3.11 有什么新变化 |
您所在的位置:网站首页 › python3升级 › Python 3.11 有什么新变化 |
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 加载全局变量 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 |