写点什么

Python 3.8 已经来了,你准备好了吗?

  • 2020-02-27
  • 本文字数:3651 字

    阅读完需:约 12 分钟

Python 3.8 已经来了,你准备好了吗?

前言

上一周,我在亚马逊 AWS 官方博客发了一篇介绍 Deep Java Library (DJL)一个面向 Java 的深度学习开发库的文章。


没有等来预期的鲜花和掌声,收到的第一个反馈来自一个年轻的业内精英,他的问题居然是 –



只是为了证明尚未老矣仍能饭否,临时起意草就一篇急就章,内容围绕不那么中古的语言 – Python。

Python 3.8

过去几年,在编程语言领域 Python 可谓大红大紫。开发者对于这门语言的热情也推动了 Python 语言的的快速发展。自 2015 年开始,Python 几乎以每年一个主要版本的速度不断的演进。


col 1col 2col 3col 4
主版本发布日期结束支持日期结束安全修复日期
3.52015-09-132017-08-082020-09-13
3.62016-12-232018-12-242021-12
3.72018-06-272020-06-272023-06
3.82019-10-142021-042024-10
3.92020-10-052022-052025-10

来源:https://en.wikipedia.org/wiki/History_of_Python

就在三个月前,我们注意到在Python 官网上悄然发布了最新的稳定版本 Python 3.8。如果只是从数目字来看似乎只有 0.1 的变化,但如果仔细的阅读 PEP 文档,还是要不禁为 Python 3.8 叫一声好!

Python 3.8 的新特性

说起来这次发布的新版本从 2019 年夏天就开始就有了测试版本,短短的几个月后在 2019 年 10 月 14 日第一个官方的稳定版本就已经准备好了。这足以看出 Python 社区对这个新版本的热情。而这个稳定的版本的出现,可以让我们即刻就开始使用 Python 的新特性并从最新的改进中获益。


来源:https://www.python.org/downloads/release/python-380/

与目前使用最为广泛的 Python 3.7 对比起来,Python3.8 的变化主要表现在这几个方面 –


  • PEP 572,赋值表达式

  • PEP 570,仅限位置的形参

  • PEP 587,Python 初始化配置(改进的嵌入)

  • PEP 590,Vectorcall:用于 CPython 的快速调用协议

  • PEP 578, Python 运行时审计挂钩

  • PEP 574,具有外部数据缓冲区的 pickle 协议 5

  • 与打字相关:PEP 591(最终限定词)、PEP 586(文字类型)和 PEP 589(TypedDict)

  • 并行文件系统缓存,用于编译的字节码

  • 调试版本使用与发布版本使用相同的 ABI

  • f – 字符串支持的便捷性 = 用于调试的说明符

  • 在 finally:块中,continue 现在是合法的

  • 在 Windows 上,默认 asyncio 事件循环现在是 ProactorEventLoop

  • 在 macOS 上,spawn 启动方法默认使用 multiprocessing

  • multiprocessing 现在可以使用共享内存段来避免进程之间的 pickle 开销

  • typed_ast 被合并回了 CPython

  • LOAD_GLOBAL 速度加快了 40%

  • pickle 现在默认使用协议 4,提高了性能


在这些变化当中,给我留下深刻印象的有这样几个特性 –


  • 赋值表达式


Python 3.8 这一次增加了一个新的语法 :=,用来将值赋给一个表达式中的变量。这个新方法也被亲切地称为 “海象运算符” (walrus operator),因为这个表达式看起来像是海象的眼睛和象牙。具体用法是这样的


col 1col 2
之前现在- 海象运算符


walrus = True


print(walrus) | >>> print(walrus := True)


True


以前,赋值只能以语句形式提供。对于 Python 3.8,它可以在列表生成(list comprehensions)和其他表达式上下文中使用。


  • 仅限位置的形参


仅位置参数通过引入新的函数参数语法 “/“ 来指示某些函数参数必须在位置上指定且不能用作关键字参数,从而为库的开发者提供了更多控制权。


在描述 API 时,可以使用它们更好地表达预期的用法,并允许 API 以安全,向后兼容的方式发展。 它们还使 Python 语言与现有文档以及各种“内置”和标准库函数的行为更加一致。


col 1col 2
定义调用


def f(a, b, /, c, d, *, e, f):


print(a, b, c, d, e, f) | f(10, 20, 30, d=40, e=50, f=60)


  • 代码调试中支持的 f-string


f-string(或者称为「格式化字符串」)是在 Python 3.6 版本中加入的特性。虽然这一特性非常方便,但是开发者发现 f-string 对调试没有实际的帮助。因此,Eric V. Smith 为 f-string 添加了一些语法结构,使其能够用于调试。于是, Python 3.8 增加了在 f-string 内部使用赋值表达式的能力,需要注意的是 f-string 是从左到右计算的。


col 1col 2
之前现在- 海象运算符


city = “London”

f”Living in {city} is amazing“‘Living in London is amazing‘ | >>> import math


radius = 3.8


f”With a diameter of {( diameter := 2 * radius)}, the circumference is {math.pi * diameter:.2f}”


‘ With a diameter of 7.6 the circumference is 23.88‘


  • System V 风格共享内存带来的性能的提升


在版本 3.8 中,Python 开始支持 System V 风格的共享内存。这种支持允许创建可以在 Python 进程之间共享的内存段,因此有助于在进程之间共享数据时避免(反)序列化的成本。这个变化引入了一个新的管理器 multiprocessing.managers.SharedMemoryManager。该管理器允许基于管理器来访问此共享内存功能。 此外,还引入了一个名为 multiprocessing.shared_memory 的新程序包。 这个程序包包含 SharedMemory 和 ShareableList 类。 前一个类提供对共享内存的“原始”访问,而后一个类则通过将其抽象为 Python 中的列表来提供对共享内存的访问。可以设想,这个特性对于进程间通讯的效率的提升将是显而易见的。


如果有兴趣,可以体验一下这段代码带来的两种场景的对比


_源代码:_https://gist.github.com/rvprasad/899ad680b70cfecb81718161798f3862/raw/5719d5a28dd21e871c5a485ec41193bdfef40595/test_mulitprocessing_shared_memory.py

安装 Python 3.8

Python 3.8 已经是一个稳定的版本,并且许多使用广泛的 Python 包已经兼容于这个最新的版本。在我初步测试中,无论 AWS 的 Python 开发包 boto3,还是 NumPy,Django 等等都可以很好的运行于 Python 3.8 之上。如果需要自行体验这个最新版本,首先需要的就是在系统中安装 Python 3.8。


  • Ubuntu 18.04


在 Ubuntu 18.04 官方的“仓库”中已经提供了 Python 3.8 的程序包。我们只需要用这样一个简单的命令就可以完成安装 –


Python


sudo apt install -y python3.8
复制代码


如果考虑到开发中的需要,还可以安装这几个包 –


Python


sudo apt install -y python3.8-dev python3.8-venv python3.8-doc
复制代码


安装后的 Python 版本是这样的 –



  • Amazon Linux 2


目前 Amazon Linux 2 的官方”仓库” 以及 EEPL 的“仓库”中都没有提供 Python 3.8 的安装包。不得已,我们只能自己动手。不过不用担心,我为大家准备了一个一键安装。安装脚本的内容是这样的 –



这个脚本看起来啰嗦,其实完成下载、编译、安装的过程却很快。在我的一台 m5a.2xlarge 的实例上,仅仅用了大约 28 秒的时间就完成了全部过程。安装完成以后,我们就得到了完整的 Python3.8 环境,可以让我们尽情体验这些新的特性了。


Python 3.8 的另一种玩法 – Amazon Lambda

上面提到的关于 Python 3.8 的一切,其实与以往众多的 Python 新版本别无两样。但是斗转星移,我们今天使用 Python 来开发已经远远不止这样的方式。这些新的方法你也许听说过,其中就有大热的 AWS Lambda。可以说 AWS Lambda 的横空出世,给了应用开发、部署以及管理带来全新的内容。 对于我们今天的话题 Python 3.8 来说,AWS Lambda 也给出一种新的选择。


就在 Python3.8 发布之后的第 35 天,Amazon 发布了 AWS Lambda 对于 Python 3.8 的支持。我们可以将 Python 函数部署到 AWS Lambda 上,利用 Python 3.8 运行时来执行我们的 Python 代码。



在考虑程序的兼容性的前提下,我们可以在众多 Python 运行时的环境中进行选择。在程序的稳定性、性能、新特性等之间作出最适当的选择。目前在 AWS Lambda 上提供的 Python 运行时有这样几个版本 –


我应该升级到 Python 3.8 吗?

很简单,如果你打算尝试上文介绍的 Python 3.8 的任何新功能,那么就应该升级到 Python 3.8。像 Pyenv 和 Anaconda 这样的工具也可以很容易地安装多个版本的 Python,也包括了 Python3.8。或者,你也可以运行官方的 Python 3.8 Docker 容器。这可能是另一个最简便的体验的方式


不过,是否应该将生产环境升级到 Python 3.8 呢?这需要考虑你的项目是否依赖 Python 3.8 的新功能以及程序的兼容性的问题。例如 Nvidia 的 TensorRT 的 Python 程序包目前还无法支持 Python 3.8 。至于 AWS Lambda,我建议我们首先进行的是兼容性的测试,之后考虑一个周密的升级的计划。当然升级版本以运行 Python 3.8 可以说是非常安全的,而且我们的代码也能利用新版本的特性来进行优化。考虑到历史上 Python2 到 Python3 的升级带来的巨大代价,我们还是尽早的开始考虑 Python 版本的渐进升级的策略吧。


作者介绍: 费良宏,AWS Principal Developer Advocate。在过去的 20 多年一直从事软件架构、程序开发以及技术推广等领域的工作。他经常在各类技术会议上发表演讲进行分享,他还是多个技术社区的热心参与者。他擅长 Web 领域应用、移动应用以及机器学习等的开发,也从事过多个大型软件项目的设计、开发与项目管理。目前他专注与云计算以及互联网等技术领域,致力于帮助中国的 开发者构建基于云计算的新一代的互联网应用。


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/python-3-8-is-here-are-you-ready/


2020-02-27 17:04767

评论

发布
暂无评论
发现更多内容

明道云HAP成功通过了AWS 的 FTR 认证

明道云

鸿蒙HarmonyOS实战-ArkUI动画(布局更新动画)

蜀道山

鸿蒙 架构 HarmonyOS 鸿蒙系统 鸿蒙 Ability

linux是什么语言开发的

百度搜索:蓝易云

云计算 Linux 运维 C语言 云服务器

淘宝开放平台API接口:淘宝店铺订单列表接口丨淘宝店铺订单详情接口丨淘宝店铺订单物流接口

tbapi

淘宝店铺订单接口 淘宝店铺订单详情接口 淘宝店铺订单物流接口

一文读懂Pencils Protocol Valut的收益叙事:一鱼多吃

BlockChain先知

一文读懂 Pencil 积分,打开 Pencils Protocol 生态权益大门

股市老人

鸿蒙HarmonyOS实战-ArkUI组件(Canvas)

蜀道山

鸿蒙 架构 HarmonyOS 鸿蒙系统 鸿蒙 Ability

linux主要是干嘛的

百度搜索:蓝易云

云计算 Linux 运维 服务器 云服务器

银行核心背后的落地工程体系丨混沌测试的场景设计与实战演练

PingCAP

数据库 开源 分布式 TiDB

工作卷,是主动选择还是迫于无奈?

王中阳Go

golang 微服务 面试题 大厂面经 Go进阶

OpenHarmony公开课 - 开发者手机OTA升级适配

Laval小助手

Pencils Protocol Valut 板块:实现杠杆挖矿收益&一鱼多吃

石头财经

大模型一体机是在“卖盒子”吗?

脑极体

AI

一文读懂Pencils Protocol Valut的收益叙事:一鱼多吃

股市老人

Intel HDSLB 高性能四层负载均衡器 — 快速入门和应用场景

云物互联

云计算 负载均衡 网络

云服务器的租用价格

百度搜索:蓝易云

云计算 运维 服务器 云服务器 ECS

linux是什么时候诞生的

百度搜索:蓝易云

Linux 运维 操作系统 服务器 云服务器

linux是什么架构

百度搜索:蓝易云

云计算 Linux unix 运维 云服务器

PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来

PingCAP

数据库 分布式 TiDB

一文读懂Pencils Protocol Valut的收益叙事:一鱼多吃

加密眼界

线上展厅是什么?和传统展厅相比有什么区别和优势?

点量实时云渲染

云展厅 3D展厅 线上展厅

什么是正向控制,反向控制?

玄兴梦影

正向控制 反向控制

Pandabuy VS Wegobuy 淘宝代购系统

tbapi

淘宝代购系统 Pandabuy wegobuy

多点 Dmall x TiDB:出海多云多活架构下的 TiDB 运维实战

PingCAP

数据库 分布式 TiDB 多云

Python 3.8 已经来了,你准备好了吗?_行业深度_AWS_InfoQ精选文章