Python 3.9 于2020年10月5日发布。Python 3.9不仅为Python开发者带来了新的特性,同时为Python社区带来了一次重要的版本迭代升级。本篇文章主要介绍 Python 3.9的新特性,方便Python开发者熟悉新版本并将其应用到实际项目中。
一、解释器变化
1、解释器启动性能优化
Python 3.9对解释器启动性能进行了优化,通过将parsing启动编译器改为延迟加载,在Python启动过程中编译器不会马上加载,从而减少了Python解释器启动时间。
import timeit
print(timeit.timeit(lambda: exec("", {}, {})))
# 3.8.6 60.0ms +- 789ms
# 3.9.0b2 37.4ms +- 928us
上述代码是运行 Python3.8.6 和 Python 3.9.0 beta2 两个版本解释器启动的性能对比。
2、字节码解释器
在Python 3.9中,引入了一个新的子解释器,用于多线程编程。这些解释器之间互相隔离并且具有有限的交互方式,避免了不同线程间变量名冲突问题。同时,它还提供了更快的切换速度和更好的线程安全性。
二、类型提示增强
1、函数注解在参数和返回值位置同时使用
在Python 3.9中,函数注释不仅可以用于函数参数还可以用于函数返回值。
from typing import List
def foo() -> List[str]:
return ['hello', 'world']
print(foo()) # ['hello', 'world']
2、对Type Hint的简化
Python 3.9中简化了Type Hint中list和dict类型的注释写法。使用Python 3.9,我们可以这么写:
def append_to_list(lst: list[str], value: str):
lst.append(value)
三、其他语言特性借鉴
1、New parser:PEP 617 的解析器更改是Python 3.9中的一个重要变化。Python从手写的解析器改为了使用新的解析器框架,以获得更好的可维护性和更高的性能。
2、Zero-overhead exception handling:Python 3.9实现了PEP 584提出的预先分配异常对象,这样可以避免在发生异常时临时分配异常对象。
3、全新的模块zoneinfo:Python 3.9中引入了zoneinfo模块,用于提供本地时间和时区信息。
四、有用的标准库和模块功能
1、functools.cached_property:为了减少重复计算,Python 3.9引入了一个新的缓存属性。
import timeit
class Weather:
@functools.cached_property
def data(self):
# do expensive computation
return self.result
w = Weather()
print(w.data())
print(w.data())
2、importlib.metadata:通过importlib.metadata,Python 3.9可以查找和访问元数据,例如使用pip安装新模块自动生成的元信息。
import importlib.metadata
print(list(importlib.metadata.packages()))
# ['Pillow', 'altgraph', 'certifi']
五、结语
本文介绍了Python 3.9中的一些重要特性和增强。Python 3.9的发布对Python开发者和Python社区都意义重大。通过学习Python 3.9的新特性,可以提高Python开发者的效率和开发质量。未来,Python的发展空间还会进一步扩大。