写点什么

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:041094

评论

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

【程序猿历程】2020年总结,java高级课程视频

Java 程序员 后端

【设计模式】代理模式,java面试官常问的问题

Java 程序员 后端

一元稀疏多项式计算器 【 数据结构课设作业 】 带界面

Java 程序员 后端

一篇文章!彻底弄透Java处理GMT-UTC日期时间,java百度天气接口api

Java 程序员 后端

【新】虚拟机深层系列,java底层实现原理

Java 程序员 后端

【源码分析设计模式 10】SpringMVC中的建造者模式,mybatis技术原理pdf

Java 程序员 后端

一篇文章带你深入了解MySQL 索引相关,linux视频教程下载

Java 程序员 后端

一个项目了解 SpringBoot 集成 MyBatis(1),面试必备知识点

Java 程序员 后端

一文读懂 spring MVC 请求处理流程,java程序设计教程第三版

Java 程序员 后端

一个专科生和云计算的故事,java注解处理器工作原理及过程

Java 程序员 后端

一个非常强大和友好的nginx基于lua-nginx-module(openresty)

Java 程序员 后端

一招教你搞定微信小程序-登录+支付(后台Java,windows内核编程全套视频教程

Java 程序员 后端

一文带你吃透Spring Cloud相关微服务组件及Spring Cloud Config框架

Java 程序员 后端

【计算机网络】局域网原理与技术,一次哔哩哔哩面试经历

Java 程序员 后端

【阿里Java岗的魔鬼三面】狠心刷完这6份pdf,Java开发经验谈

Java 程序员 后端

一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图

Java 程序员 后端

一篇神文让你“一夜封神“Mycat 中间件 (最详细讲解),linux操作系统实用教程文东戈课后答案

Java 程序员 后端

【线程】,东软集团Java笔试题

Java 程序员 后端

一个即将从《蚂蚁金服》离职的Java工程师个人经历与总结

Java 程序员 后端

一文参透:缓存一致性策略以及雪崩、穿透等问题,java系统架构设计详解

Java 程序员 后端

一文带你理解Spring Cloud高并发微服务架构核心理念的五脏六腑

Java 程序员 后端

一文彻底弄懂如何选择抽象类还是接口,java序列化和反序列化面试

Java 程序员 后端

【牛客】从青铜到王者01,java基础入门第二版第二章答案

Java 程序员 后端

【金九银十冲刺】Java岗面试题核心每日知识点,kafka原理图

Java 程序员 后端

一夜之间火爆GitHub的好文!!阿里资深架构师整理分享,疯狂膜拜

Java 程序员 后端

【深度思考】JDK8中日期类型该如何使用,java面试题百度网盘

Java 程序员 后端

【设计模式】适配器模式,手动实现一个简单的AOP框架

Java 程序员 后端

一口气说出 Redis 16 个常见使用场景,rxjava原理

Java 程序员 后端

【自我感悟&&致学弟学妹】大三上的感悟,linux学习教程

Java 程序员 后端

【设计模式】原型模式,java基础入门第二版第四章课后答案

Java 程序员 后端

一文看透Java高并发:Synchronized锁的性质、原理及其缺陷

Java 程序员 后端

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