Python 3.11 有什么新功能?

详细概述Python 3.11中最重要功能,包括如何安装 beta 版本以及何时可以获得官方稳定版本。

长按关注《Python学研大本营》,加入读者群,分享更多精彩 扫码关注《Python学研大本营》,加入读者群,分享更多精彩

Python在过去四年中三度获得 TIOBE “年度语言”奖。到 2022 年中,这门流行的编程语言仍然在 TIOBE 指数中名列前茅。

Python 在 2022 年 6 月的 TIOBE 指数中名列前茅。

Python 的评分为 12.74% 意味着关键字“Python”出现在大约 13% 的与编程相关的搜索引擎查询中。换句话说,互联网上每第 7 个或第 8 个编程问题都是关于 Python 的。

今天,Python 经常与数据科学和人工智能领域的最大突破联系在一起。从业者欣赏它的简单性、用于大量任务的大量内置和第三方库以及它的社区。

随着 3.11 的最终稳定版本于 2022 年 10 月 3 日发布,Python 社区可以期待各种受欢迎的更新,包括显着的速度提升、更好的错误处理和调试,以及对标准库的大量生活质量改进。

Python 3.11 的新特性

Python 3.11 变更日志包含几乎无穷无尽的错误修复、改进和添加列表,其中大部分您可能永远都不会注意到。但是,当稳定版本到来时,一些关键的新功能可能会大大改善您的 Python 工作流程。这些新功能概述如下。

1.速度提升

让数据科学家兴奋的第一个重大变化是速度提升——与 3.10 相比,标准基准套件的运行速度提高了约 25%。Python 文档声称 3.11 在某些情况下可以快 60%。以下是如何自己执行基准测试,以便自己测试速度改进。

要比较 Python 3.10 和 3.11 的速度,您需要安装 Docker。确保 Docker 桌面正在运行后,在终端中运行这两个命令,这将下载两个 Python 版本的两个镜像。

$ docker run -d python:3.10.4-bullseye

$ docker run -d python:3.11-rc-bullseye

复制代码 下载的图像应该在您的 Docker 仪表板中可见,您也可以在其中启动它们。

python 3.11的Docker安装

启动容器后,您可以运行 docker ps 来查看容器 ID、图像、状态等详细信息。

正在运行的容器也可以在仪表板的 Containers 选项卡下看到,您还可以在其中找到“”旁边的 CLI 按钮Run/Stop ”旁边找到 CLI 按钮单击它们以启动两个容器的终端选项卡。

在两个选项卡中,pyperformance通过pip. 然后,在每个容器终端中运行以下命令。

对于 Python 3.10

$ pyperformance run -r -o py310.json

对于 Python 3.11

$ pyperformance run -r -o py310.jsone run -r -o py311.json

这些命令将为来自标准库的大约 60 个 Python 函数运行基准测试并生成 JSON 元数据。我可以选择添加-r标签来告诉pyperformance我希望测试是严格的,这需要更多时间。就我而言,这两个容器都运行在配备 AMD Ryzen 12 核 CPU 的 Windows 机器上。

现在,我们在两个容器中有两个 JSON 文件,我们需要将它们放在一个目录中以继续进行速度测试。为此,我们将使用docker cp命令将 JSON 文件从 Python 3.11 容器复制到 3.10。

在单独的终端选项卡中运行以下命令,更新路径以反映计算机上的正确路径:

$ docker cp crazy_snyder:/py311.json C:/Users/bex/Desktop

$ docker cp C:/Users/bex/Desktop/py311.json charming_proskuriakova:/

就我而言,crazy_snydercharming_proskuriakova是正在运行的容器的 ID。现在两个 JSON 文件都在 Python 3.10 容器中。要完成基准测试并将结果保存为 CSV,请运行以下命令。

$ pyperformance compare py310.json py311.json --csv comparison.csv

$ docker cp charming_proskuriakova:/comparison.csv C:/Users/bex/Desktop/articles

最后,让我们将 CSV 加载到 Pandas 中并对其进行分析:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("data/comparison.csv")
df.rename({"Base": "py310", "Changed": "py311", "Benchmark": "function"},
                   axis=1,
                   inplace=True)
>>> df.shape
(59, 3)
>>> df.sample(5)

数据框中的每一行都记录了两个版本运行给定 Python 函数所花费的时间(以毫秒为单位)。让我们绘制一个加速的直方图。

df["speed_up"] = (df["py310"] / df["py311"]).round(3)

fig, ax = plt.subplots()

sns.histplot(df["speed_up"], bins=11)
ax.set(xlabel="Speedup (times)", 
           title="Python 3.10 vs. Python 3.11 - speedup comparison")

plt.show()

python 3.11 和 python 3.10 之间的速度差异

从图中可以清楚地看出,Python 3.11 中的大多数函数都快了大约 1.2 倍 (20%)。我们也可以用平均值和中位数来确认估计。

>>> df["speed_up"].mean()
1.2605593220338982
>>> df["speed_up"].median()
1.207

似乎有一种情况是速度增加超过了 60%。

>>> df["speed_up"].max()
1.899

还有四种情况 Python 3.10 比新版本更快。

>>>  (df["speed_up"] <= 1).sum() 
4

虽然性能提升在纸面上是显而易见的,但改进的具体影响因人而异,并且 Python 3.11 的稳定最终版本尚未发布。基准测试使用纯 Python 函数,您在日常工作中可能不会使用太多,但为 Python 3.10 和 3.11 设置 Docker 安装将使您了解特定用例的速度提升。

2. 更好的错误信息

Python 3.11 的另一个令人兴奋的特性是更好的错误消息传递,可以精确定位错误的确切位置。Python 3.11 没有返回以难以解释的错误消息结尾的 100 行回溯,而是指向导致错误的确切表达式。

python 3.10中的回溯错误

在上面的示例中,Python 解释器指向导致脚本崩溃的 x,因为它的 None 值。在当前版本的 Python 中,该错误是不明确的,因为有两个具有“x”属性的对象。但是,3.11 的错误处理清楚地指出了有问题的表达式。

这个例子展示了 3.11 如何从深度嵌套的字典中查明错误,并且可以清楚地显示错误属于哪个键。

python 3.11中的回溯消息

您可以在复杂的算术表达式中看到相同的精度。

Python 3.11 中的回溯消息

更新后的错误消息绝对是一个受欢迎的补充,特别是对于那些难以调试脚本的数据科学家。

3. 异常说明

“显式胜于隐式。”

上面这句话是Python 之禅的第二行,列出了 Python 的 20 条设计原则。这代表了 Python 代码应尽可能具有表现力的规则。

为了强化这种设计模式,Python 3.11 引入了异常注释 ( PEP 678 )。现在,在您的 except 子句中,您可以add_note()在引发错误时调用该函数并传递自定义消息。

import math

try:
  math.sqrt(-1)
except ValueError as e:
  e.add_note("Negative value passed! Please try again.")
  raise

自定义例外

如果您编写了如下所示的自定义异常类,则可以在受保护的类级属性内向该类添加多个注释__notes__:

import math

class MyOwnError(Exception):
   # Should be a list of strings
   __notes__ = ["This is a custom error!"]

try:
   math.sqrt(-1)
except:
   raise MyOwnError

自定义异常

现在,当解释器遇到错误时,它将在常规消息正文之后显示自定义消息。

还有一种新语法可以使用 except* 子句引发异常,该子句与新的 ExceptionGroup 类一起使用。PEP 654表示您可以使用它在各种情况下同时引发多个不相关的错误。大多数这些情况都太小众了,比如使用 web sockets、与 并发编程等等,这些在日常数据科学工作中很少出现,但是如果你有兴趣,你可以在这里asyncio了解新语法。

4.新的打字功能:Self

静态类型语言有助于使您的代码可读且易于调试。定义变量、函数输入和输出的确切类型可以为您节省数小时的调试时间,并使其他人更容易阅读您的代码。添加键入注释还可以让现代 IDE 在您键入函数名称时显示函数定义,从而使您的函数更容易被其他人解释。

到目前为止,Python 中强大的类型化模块几乎可以为任何数据类型提供类,除了返回自身实例的类。在当前版本的 Python 中,以下示例是不可能的:

from typing import Self
class Language:

  def __init__(self, name, version, release_date):
      self.name = name
      self.version = version
      self.release_date = release_date

  def change_version(self, version) -> Self:
      self.version = version

      return Language(self.name, self.version, self.release_date)

但是,Python 3.11 引入了 Self 类,如果函数的返回值是 self 或类本身的新实例,您可以将其添加到函数的定义中。

5. 标准库的改进

标准库还有一些其他的生活质量改进。首先,在数学模块中添加了两个期待已久的函数。

>>> import math
>>> math.cbrt(9)  # Find the cube-root of x
2.080083823051904
>>> math.cbrt(27)
3.0000000000000004
>>> math.exp2(5)  # Raise 2 to the power of x
32.0

Python 花了 28 年才添加立方根函数的事实令人惊讶,但正如俗话所说,迟到总比没有好。

分数模块还添加了一个新功能,可让您从字符串创建分数:

>>> from fractions import Fraction
>>> Fraction("22/7")  # New in Python 3.11
Fraction(22, 7)
>>> Fraction(numerator=22, denominator=7)
Fraction(22, 7)
>>> Fraction("3e-4")
Fraction(3, 10000)
>>> Fraction("-73/41")
Fraction(-73, 41)
>>> Fraction(3.1415)  # Find the closest approximation to the given float
Fraction(7074029114692207, 2251799813685248)

如您所见,分数模块对于某些算术运算非常方便。主要是,我喜欢你如何找到最接近给定浮点数的分数。您可以通过提供分母限制更进一步:

>>> from math import pi
>>> Fraction(pi).limit_denominator(100000)
Fraction(312689, 99532)

还有一个名为tomllib解析 TOML 文档的新模块。TOML(Tom's Obvious Minimal Language)是一种流行的文件格式,用于编写人类可读的配置文件。这是该项目主页上的图片:

TOML 登陆页面

import tomllib

toml_str = """
python-version = "3.11.0"
release_date = "2022-10-22"
"""

data = tomllib.loads(toml_str)
print(data)  # {'python-version': '3.11.0', 'release_date': '2022-10-22'}
print(data['python-version'])  # 3.11.0
print(data['release_date'])  # 2022-10-22

Python 3.11 发布日期

Python 3.11 的开发于 2021 年 5 月 5 日开始。从那时起,已经发布了 7 个 alpha 版本,与 2022 年 5 月 8 日的第一个 beta 版本相吻合。从这个日期到正式发布,不会有新功能引入Python。

最终的稳定版本将在 2022 年 10 月 3 日发布,同时还有三个 beta 版本和两个候选版本。

推荐书单

《Pandas1.x实例精解》

本书详细阐述了与Pandas相关的基本解决方案,主要包括Pandas基础,DataFrame基本操作,创建和保留DataFrame,开始数据分析,探索性数据分析,选择数据子集,过滤行,对齐索引,分组以进行聚合、过滤和转换,将数据重组为规整形式,组合Pandas对象,时间序列分析,使用Matplotlib、Pandas和Seaborn进行可视化,调试和测试等内容。此外,本书还提供了相应的示例、代码,以帮助读者进一步理解相关方案的实现过程。 本书适合作为高等院校计算机及相关专业的教材和教学参考书,也可作为相关开发人员的自学用书和参考手册。

链接:https://u.jd.com/UKjx4et

精彩回顾

《Pandas1.x实例精解》新书抢先看!

【第1篇】利用Pandas操作DataFrame的列与行

【第2篇】Pandas如何对DataFrame排序和统计

【第3篇】Pandas如何使用DataFrame方法链

【第4篇】Pandas如何比较缺失值以及转置方向?

【第5篇】DataFrame如何玩转多样性数据

【第6篇】如何进行探索性数据分析?

【第7篇】使用Pandas处理分类数据

【第8篇】使用Pandas处理连续数据

【第9篇】使用Pandas比较连续值和连续列

【第10篇】如何比较分类值以及使用Pandas分析库

长按关注《Python学研大本营》

长按二维码,加入Python读者群

扫码关注《Python学研大本营》,加入读者群,分享更多精彩

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值