Python311新特性-特化指令specializing adaptive interpreter-typing-asyncio

Python3新特性

python3.11增加了许多特性,让python更快更加安全,本文从应用层面来讲一下python3.11的这些新特性

特化自适应解析器是什么,如何利用特化写出更高性能的代码

如何在项目中落地type hint写出健壮的代码,有那些注意事项

asyncio的概念及应用场景

Faster Python 3.11

Faster

  1. Zero cost exception(if not thrown)
  2. 10% faster re & atomic grouping, possessive qualifiers
  3. 10-15% faster startup
  4. Faster function calls
  5. C-style formatting sometimes as fast as f-string
  6. Less memory for string keys in dicts
  7. Specialized adaptive interpreter
  8. And more!

Future

  1. Major focus for the next several releases
  2. Simple JIT planned eventually
  3. The main driver behind C API changes

Specializing(特化)

当一个函数被执行的次数足够多(>53)就会被特化,被特化的指令叫hot code。(次数需要看对应不同版本cpython源码)

源码:Python/specialize.c -> _PyCode_Warmup

特化流程:

​ 原始指令 —— 中间状态(名称中含ADAPTIVE) —— 特化后的指令(非常快)

img

图片来源:Python3-源码剖析(二)-指令特化 | Yuerer's Blog

碰到问题

同样的代码在命令行中可以被特化,而放一个.py文件中,再通过dis.dis(module.func,adaptive=True)就无法被特化

示例函数代码如下:

>>> def f(x):
...     return x*x
... for i in range(100):
...     f(i)

image-20241028155628526

解释:乘法的opcode为BINARY_OP,在这个例子中我们传的是int当被特化后会变成BINARY_OP_MULTIPLY_INT,因为python弱类型,确定的类型可以极大提高速度,建议去看cpython的实现源码加深理解。

把上面代码放在.py文件中,发现无法进行特化

>>> dis.dis(adaptiveTest.f,adaptive=True)10           RESUME                   011           LOAD_FAST                0 (x)LOAD_CONST               1 (2)BINARY_OP                5 (*)RETURN_VALUE

最终找到原因:我在vscode自带的终端import之后,在运行时修改了py代码,没有重新reload,导致没有加载最新的代码(py3的reload和py2有区别)。

另一个方法就是:重新打开windows的cmd中并执行一遍

image-20241028161816185

还有一种方法就是:稍稍调整一下代码,把dis加到.py中,然后运行python文件也可以看到函数被特化

import dis
def foo(x):return x*xfor i in range(100):foo(i)dis.dis(foo,adaptive=True)
#在python中调用dis打印出字节码

LOAD_ATTR(getattr)特化

self.xx 本质就是getattr,对应的opcode为 LOAD_ATTR,在python3中默认可以被特化,例如:

  1. 继承object的原生Python类可以特化

  2. 继承后object重写 __getattr__ 的Python 类无法特化

  3. C 扩展 Python 类无法特化

为什么后面2种不能完成特化?

class B(object):def __getattr__(self, name):#重写__getattr__return super(B, self).__getattr__(name)b = B()
b.x = 1
def mytest(n):for i in range(n):b.x #无法被特化

因为:cpython中特化前判断是否为原始的getattr函数,见:Python\specialize.c

image-20241103104311246

image-20241103104308223

如何让C扩展python类可以特化?

重点讲解:2种实现方法

  1. 在c扩展类中增加cache保存下标
  2. 修改虚拟机的实现,传入下标

如何检查代码是否被特化?

可视化特化工具,github:https://github.com/brandtbucher/specialist

运行代码并生成(网页)报表,那么如何纳入到项目中进行可视化呢?因为游戏项目依赖于引擎API,需要跑在游戏引擎之上,不同于纯python环境

Typing check(type hint)

base vscode Pylance

Type Ignore

pyrightconfig.json 兼容py2的文件,忽略整个文件

overload

配合vscode的pylance特性来做代码检查

当函数传参个数不符合要求时,在IDE中进行报错提示

Stub Files

和py同名的文件格式为.pyi,语法也一样,在这里写type hint,提供给IDE使用,运行时无关

AsyncIO

What is it?

Keywords pair(async / await)

So what?

What is it?

Asyncio is used as a foundation for multiple Python asynchronous frameworks that
provide high-performance network and web-servers, database connection libraries,
distributed task queues, etc.
Asyncio is often a perfect fit for IO-bound and high-level structured network code.

简单的例子发挥不出作用

import asyncio
async def foo():await asyncio.sleep(1)print ('foo')
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(foo())

上面这个简单的asyncio的例子和下面这段代码作用一样,无法体现出asyncio的作用

def foo():time.sleep(1)print('foo')
foo()

适合用在那些地方?

Patch

  • Simultaneously download multiple block of patch

Distributed Task Framework

  • Multi-Process Management through ProcessPoolExecutor
  • Export-table-tools
  • Texture Compressor
  • build packer

感兴趣的可以搜索ProcessPoolExecutor去了解

UVLoop

uvloop用来替换asyncio的event loop更高效,底层使用libuv通过cython实现,比原生的asyncio快2~4倍,有线上项目已验证过其稳定性

开源地址:https://github.com/MagicStack/uvloop

简单几行就可以替换asyncio的event loop

import asyncio
import sysimport uvloopasync def main():# Main entry-point....if sys.version_info >= (3, 11):with asyncio.Runner(loop_factory=uvloop.new_event_loop) as runner:runner.run(main())
else:uvloop.install()asyncio.run(main())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826081.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟人工轨迹:算法能够模拟出非…

猿人学web端爬虫攻防大赛赛题第2题——动态cookie

题目网址:https://match.yuanrenxue.cn/match/2 解题步骤看触发的数据包。在请求头中的cookie字段中m变量的值一看就是加密过的。看Initiator模块中的request。点进去,打断点。我们只能在响应内容中看到页面数据,但是关于m的加密却是没有看到。刷新界面,出现如下画面。说明…

易语言模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟人工轨迹:算法能够模拟出非…

C++模拟真人动态生成鼠标滑动路径

一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟人工轨迹:算法能够模拟出非…

‘随机失活’:人工智能真的在模仿人脑吗?

序言:过拟合是人工智能训练中的一个常见问题,类似于一位“读死书”的学生,他只能机械地背诵书本内容,缺乏灵活性,一旦题目稍有变化便无法理解。为了解决这一问题,科学家们从人脑的学习方式中获得启发,设计出“随机失活”方法。在学习过程中,随机关闭部分神经元,避免神…

《计算机基础与程序设计》第六周学习总结

2024-2025-1 20241412 《计算机基础与程序设计》第六周学习总结 作业信息这个作业属于哪个课程 [2024-2025-1-计算机基础与程序设计] https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里 2024-2025-1计算机基础与程序设计第一周作业 https://edu.cnblog…

SQL注入绕过

WAF介绍 一、WAF介绍 WAF(Web Application Firewall,Web应用防火墙)及与其相关的知识,这里利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为web应用提供保护的一款产品。 WAF基本上可以分为以下几类: 1.1 软件型WAF 以软件形式装…

财务知识-2024年新会计准则会计科目表

财务知识-2024年新会计准则会计科目表

Qt/C++地图动态绘制折线多边形矩形圆形标注点/可编辑拖动调整大小和位置

一、前言说明 无论哪一家的地图,都提供了调用函数绘制各种覆盖物,但是有时候的场景是希望进入添加覆盖物模式,然后每次在地图上按下都自动生成对应的覆盖物比如圆形,这样就不需要用户提前知道经纬度坐标等参数,而是让用户自己在地图上拾取即可,这样灵活性就极大的提高了。…

.NET 9 中没有 wasi 实验性支持

2023年10月份写个一篇《本计划在 .NET 8 中推出的 WASI 推迟到 .NET 9 》[1],根据此问题,在 .NET 9 RTM 中似乎不会有wasi-experimental,仅使用 componentize-dotnet [2]的项目才能工作/将被更新,WASI 实验正在 NET 10 中继续进行。2024年9月份字节码联盟发布了一篇文章《 使…

鼠标打字的背后,隐藏着一个感人的故事

感谢所有善良的人感谢所有善良的人 ‍ 转载声明 原文:有什么软件官方已经停更了或者公司已经倒闭了,但是你还在用并且觉得很好用的? - 黄亮的回答 - 知乎 优化了下排版,改正了两个错别字,以下是正文: 正文 2019 年,有一个叫方瑜,网名冷敏寒子夜的女孩在网上寻找一个极为…

基于PyTorch的大语言模型微调指南:Torchtune完整教程与代码示例

近年来,大型语言模型(Large Language Models, LLMs)在自然语言处理(Natural Language Processing, NLP)领域取得了显著进展。这些模型通过在大规模文本数据上进行预训练,能够习得语言的基本特征和语义,从而在各种NLP任务上取得了突破性的表现。为了将预训练的LLM应用于特定领域…