您的位置:

Python 3.8与3.9的区别

一、性能提升

Python一直以来都以慢著称,Python3.9相对于3.8来说在性能提升方面有了一些改进。Python 3.9 的字符串方法现在比以前快了 20% 至 30%, 在有些情况下(例如字符串格式化和正则表达式)可以提高高达 50%。此外,3.9 还更快地解析字节码、有一个全新的解析器以及集成了一种新的哈希算法,这些都可以在性能上提高。

举个例子,Python3.9 对 PEP 563 中的 Lazy import 进行了优化,Lazy import 能够大幅降低启动时的解释器内存占用,从而缩短启动耗时。这意味着更大的代码库与更短的启动时间,特别是在大型的代码库和团队中会受益良多。

下面代码演示了 Python3.9 对于字符串方法的性能优化。

    
    # Python 3.8
    python3.8 -m timeit -n 1000000 "s = ''.join(['a' for _ in range(10000)])" "s = s.strip()"

    # Python 3.9
    python3.9 -m timeit -n 1000000 "s = ''.join(['a' for _ in range(10000)])" "s = s.strip()"
    

二、新特性

在新版本中,Python不断推陈出新,3.9 版本中有一些非常酷炫的新特性,比如:

1. 通过 importlib.metadata 访问安装在 Python 中的软件包元数据
2. 通过 PE 615 实现类型注释中的 Union 在细节方面的改进
3. 可自定义解释器级别的警告
4. 新的操作符 |=, ^=, 及 &= 在 dict 类型中支持原位操作
5. 增加了删除 dict 类型中指定键的方法
6. 新生产者——消费者集合 Queue.SimpleQueue
7. time 模块支持各种高精度时间戳,比如时间范围内的月数、周数和天数。等等

下面是 Python3.9 版本中一个新的字符串方法的样例:

    
    # Python 3.9
    '12345'.removeprefix('12')
    '12345'.removesuffix('34')
    

三、语法糖的改进

Python一直都被人称作“胶水语言”,原因是因为它的语法灵活,使得许多任务变得非常容易。Python3.9 在语言方面加入了许多新的语法特性。

举个例子,Python3.9新增了一种新的操作符 |=,它是 dict 类型的原位操作。

    
    # 操作符 |= 示例
    d = {'spam': 1}
    d |= {'ham': 2}
    print(d) # {'spam': 1, 'ham': 2}
    

除此之外,Python3.9还进行了一些小幅度的改进,例如:使用字典推导式创建有重复键时,新版本的字典推导式仅保留最后一个键。

下面是使用 Python3.9 版本中的新语法特性创建字典的样例:

    
    # Python 3.8
    d = {k: v for k, v in [('spam', 1), ('spam', 2), ('ham', 3)]}
    print(d) # {'spam': 2, 'ham': 3}

    # Python 3.9
    d = {k: v for k, v in [('spam', 1), ('spam', 2), ('ham', 3)]}
    print(d) # {'spam': 2, 'ham': 3}
    

四、类型提示

类型提示一直是 Python3.x 版本的一个非常重要的特性,它使得 Python 代码变得更加可读可维护。Python3.9 版本也进行了一些小幅度的升级,其中最显著的变化是更好的 Type Union。以下是 Type Union 在 Python3.9 版本中的演示:

    
    # Python 3.8
    def func(a: 'int | str') -> None:
        return a

    # Python 3.9
    def func(a: int | str) -> None:
        return a
    

相比之前,Python3.9 中的 Type Union 语法更为简洁易读。

五、字面量中区分私有属性和函数

在 Python 中,想要标识一个属性或函数为私有的,通常会在其名字前面加上一个下划线,例如:_my_private_function。但在旧版本中,即使这种方式已经成为了惯例,但也只能算是类库的一种约定,Python3.9 版本中,加入了这个官方机制,可以直接标识私有属性或函数,以明确其访问权限。

下面的代码演示了 Python3.9 版本中如何使用字面量来区分私有函数和常规函数:

    
    # Python 3.8
    def my_function(arg1, arg2):
        _my_private_implementation(arg1, arg2)
        
    def _my_private_implementation(arg1, arg2):
        pass

    # Python 3.9
    def my_function(arg1, arg2):
        def _my_private_implementation(arg1, arg2):
            pass
        _my_private_implementation(arg1, arg2)
    

六、结语

以上是 Python3.9 和3.8版本的一些不同之处。Python3.9 版本更快、更易读、更易维护,同时实现了更高效的代码和更简单易懂的语法。尽管可能存在使用 Python3.9 版本之前,API 不兼容或者构 b成本等问题,但是升级到 Python3.9 版本值得一试,因为它能带来很多好处。