生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

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

评论

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

小程序的安全架构解析

Onegun

小程序 安全 小程序容器 小程序架构

做客《创新之路》,Tapdata 创始人唐建法对话央视著名主持人李雨霏,畅聊创业故事

tapdata

Spring Boot如何优雅提高接口数据安全性

做梦都在改BUG

Java spring Spring Boot

如何利用java实现一个布隆过滤器?

做梦都在改BUG

Java 布隆过滤器

用户费力度建设初探

Qunar技术沙龙

去哪儿网 用户费力度

大模型竞争白热化 这家广州的科技公司却开辟了新战场

科技热闻

哪些技术有可能坐上智慧城市发展的快车

Onegun

智慧城市 小程序容器 数字城市

大开眼界!Jenkins结合SpringCloud+K8S,打通微服一条龙技术讲解

做梦都在改BUG

Java Kubernetes k8s Spring Cloud jenkins

德邦快递:逆境之下,让数字化辅助业务的利润增长

Kyligence

数据分析 数字化管理 指标中台

【活动报名】PolarDB开源数据库&PG中文社区技术沙龙温州站

阿里云数据库开源

数据库 postgresql 阿里云 开源 polarDB

跨平台的Markdown编辑器:Typora for Mac中文版

真大的脸盆

全新问世!阿里内藏版的SpringBoot 2.5实战笔记,全面覆盖新特性

做梦都在改BUG

Java spring 微服务 Spring Boot 框架

用scrum敏捷工具做敏捷需求管理

顿顿顿

Scrum 敏捷开发 敏捷项目管理 看板工具

阿里内部教材:15W字的SpringCloud微服务实战,我一口气给你打包

做梦都在改BUG

Java 架构 微服务 Spring Cloud

WebSocket与Socket、TCP、HTTP的区别

Apifox

程序员 TCP socket HTTP websocket

GitHub发布即百万!字节内网超实用 java性能优化手册,star超十万

Java你猿哥

Java JVM ssm Java性能调优 java程序优化

今年互联网是“银二铜三铁四丐五”?程序员面试如何破局?

Java你猿哥

Java 架构 算法 多线程 java面试

MLCC龙头涨价;车厂砍单芯片;台积电28nm设备订单全部取消!

元器件秋姐

芯片 汽车 资讯 新能源 MLCC

Go_Gin之初体验

神木鼎

golang 日更 gin框架

NFTScan 开发者平台发布 CU 付费方案,为 Web3 初创团队提供多链 NFT API 服务

NFT Research

NFT #Web3

还在分不清各种IO模型?

Java你猿哥

Java Linux io I/O模型 Java IO

网易云信 RTC 音频问题排查的挑战与实践

网易云信

RTC 实时音视频 AIGC

intellij idea 粘贴字符串如何不带换行符?

源字节1号

微信小程序 开源 软件开发 前端开发 后端开发

头部企业走入无人区,国产数智化厂商挑大梁

用友BIP

兼顾可扩展、高并发与数据一致性:咸鱼优惠系统设计实践

Java你猿哥

Java 架构 ssm 架构设计 并发

软件测试丨Pytest学习笔记-Mark标记、Skip跳过、xFail预期失败

测试人

软件测试 自动化测试 测试开发 pytest

翻遍GitHub帮你总结了一份并发图册+高并发笔记,一次性搞懂并发编程

小小怪下士

Java 程序员 后端 高并发 并发

2023淘宝天猫金婴奖公布,小度学习机获年度超级新品奖!

科技热闻

从GitHub火到头条!共计1658页的Java岗面试核心MCA版,拿走不谢

做梦都在改BUG

Java java面试 Java八股文 Java面试题 Java面试八股文

Last Week in Milvus

Zilliz

Milvus Zilliz 向量数据库

如何在 Mac 上查看显示刷新率

互联网搬砖工作者

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