软硬件环境
- windows 10 64bit
- python 3.9.0
前言
2020年10月5日,python
官方发布了3.9.0正式版,本文就来看看,新版本到底有哪些变化
下载安装
首先来到官方下载网页,https://www.python.org/downloads/,傻瓜式安装,就不细讲了
这里需要注意一点,如果你原来的系统中已经有了python
环境,比如像我已经安装过anaconda
,这时候就不要讲python3.9
加入到系统环境变量PATH
中了,以免破坏原来的环境。
Python 3.9.0特性
新的语法特性
- 为
dict
增加合并运算符
合并 (|
) 与更新 (|=
) 运算符已被加入内置的dict
类。 它们为现有的dict.update
和{**d1, **d2}
字典合并方法提供了补充>>> x = {"key1": "value1 from x", "key2": "value2 from x"} >>> y = {"key2": "value2 from y", "key3": "value3 from y"} >>> x | y {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'} >>> y | x {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
- 新增用于移除前缀和后缀的字符串方法
增加了
str.removeprefix(prefix)
和str.removesuffix(suffix)
用于方便地从字符串移除不需要的前缀或后缀。 也增加了bytes
,bytearray
以及collections.UserString
的对应方法 - 标准多项集中的类型标注泛型
在类型标注中现在你可以使用内置多项集类型例如
list
和dict
作为通用类型而不必从typing
导入对应的大写形式类型名(例如List
和Dict
)。 标准库中的其他一些类型现在同样也是通用的,例如queue.Queue
def greet_all(names: list[str]) -> None: for name in names: print("Hello", name)
- 放宽对装饰器的语法限制
新的解析器
3.9.0使用于基于PEG
的新解析器替代LL
。 新解析器的性能与旧解析器大致相当,但PEG
在设计新语言特性时的形式化比LL
更灵活。
在3.10中,旧解析器将被移除,依赖于它的所有功能也将被移除(主要是parser
模块,它早已被弃用)。只有在3.9中,你可以使用命令行开关(-X oldparser
)或环境变量(PYTHONOLDPARSER=1
) 切换回LL
解析器
新增模块
zoneinfo
模块为标准库引入了IANA
时区数据库。它添加了zoneinfo.ZoneInfo
,这是一个基于系统时区数据的实体datetime.tzinfo
实现。
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
Python
3.9.0还添加了新的graphlib
模块,其中包含graphlib.TopologicalSorter
类来提供图的拓扑排序功能
改进的模块
这个就太多了,这里简单罗列一下,具体的每个模块的更改需要查看文档
- ast
- asyncio
- compileall
- concurrent.futures
- curses
- datetime
- distutils
- fcntl
- ftplib
- gc
- hashlib
- http
- IDLE & idlelib
- imaplib
- importlib
- inspect
- ipaddress
- math
- multiprocessing
- nntplib
- os
- pathlib
- pdb
- poplib
- pprint
- pydoc
- random
- signal
- smtplib
- socket
- time
- sys
- tracemalloc
- typing
- unicodedata
- venv
- xml
性能优化
- 优化了在推导式中为临时变量赋值的惯用方式
- 优化了多线程应用中的信号处理。 如果一个线程不是获得信号的主线程,字节码求值循环不会在每条字节码指令上被打断以检查无法被处理的挂起信号。 只有主解释器的主线程能够处理信号
- 在
FreeBSD
上使用closefrom()
优化了subprocess
模块 PyLong_FromDouble()
对于匹配long
的值执行速度现在加快了1.87倍- 多个
Python
内置类型(range
,tuple
,set
,frozenset
,list
,dict
)现在通过使用PEP 590
向量调用协议得到加速 - 当另一集合远大于基础集合的情况下优化了
difference_update()
的性能 Python
的小对象分配器(obmalloc.c
)现在允许(至多)一个空位可用于立即重用,而不必将其返回给OS
。这可以防止简单循环中的多余消耗,在每次迭代中可以创建和销毁全新的空位- 浮点数运算中的
floor division
现在会有更好的性能。并且此运算的ZeroDivisionError
的消息也已更新 - 使用
UTF-8
和ascii
编解码器解码短ASCII
字符串现在会加快大约15%