知识星球: 迷途小书童;个人微信:xituxiaoshutong100

Python 3.9.0新特性

Python基础 迷途小书童 0评论

软硬件环境

  • windows 10 64bit
  • python 3.9.0

前言

2020年10月5日,python官方发布了3.9.0正式版,本文就来看看,新版本到底有哪些变化

下载安装

首先来到官方下载网页,https://www.python.org/downloads/,傻瓜式安装,就不细讲了

python3.9

python3.9

这里需要注意一点,如果你原来的系统中已经有了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的对应方法

  • 标准多项集中的类型标注泛型

    在类型标注中现在你可以使用内置多项集类型例如listdict作为通用类型而不必从typing导入对应的大写形式类型名(例如ListDict)。 标准库中的其他一些类型现在同样也是通用的,例如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-8ascii编解码器解码短ASCII字符串现在会加快大约15%

参考资料

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址