从强大的新任务语法到底层重大更新,Python3.8正在朝着更现代的Python代码库迈进。3.8是流行语言Python的最新版本,适用于从自动化脚本和机器学习到Web开发的所有领域。Python3.8现已推出正式测试版,带来了许多灵活的语法更改、内存共享、更高效的序列化和反序列化、修订的字典等。当然,Python3.8也引入了各种性能改进。总体结果是使Python更快、更简洁、更一致且更现代。以下是Python3.8的最新、最重要的新增功能。赋值表达式Python3.8中最明显的变化是赋值表达式,它使用类似海象的运算符(:=)。赋值表达式允许在表达式的上下文中为变量赋值,甚至是尚不存在的变量,而不是作为一个独立的语句。while(line:=file.readline())!="end":print(chunk)在本例中,如果变量line不存在,则创建变量line,然后从file.readline()赋值.然后检查该行以查看它是否等于“结束”。如果不是,则读取下一行、存储在行中、测试等。赋值表达式遵循Python中可理解的简洁传统,包括列表理解。这里的想法是减少在某些Python编程模式中往往会出现的一些繁重的样板文件。比如上面的代码片段,通常需要两行以上的代码来表达。强制某些参数仅与位置有关为函数定义的新语法“仅位置参数”允许开发人员强制某些参数仅与位置有关。这消除了关于函数定义中哪些参数是位置参数以及哪些是关键字参数的任何歧义。只有位置参数可以定义场景,例如接受任何关键字参数但也接受一个或多个位置参数的函数。这通常是Python内置函数的情况,因此为Python开发人员提供了一种强制语言一致性的方法。来自Python文档的示例:defpow(x,y,z=None,/):r=x**yifzisnotNone:r%=zreturnr/将位置参数与关键字参数分开;在此示例中,所有参数都是Location。在以前的Python版本中,z将被视为关键字参数。鉴于上述函数定义,pow(2,10)和pow(2,10,5)是有效调用,但pow(2,10,z=5)不是。F-string调试支持f-string格式提供了一种方便(且性能更高)的方式来在同一表达式中打印文本和计算值或变量:x=3print(f'{x+1}')这将打印4.在f字符串表达式的末尾添加=打印f字符串表达式本身的文本,后跟值:x=3print(f'{x+1=}')这将打印x+1=4。多处理模块共享内存在Python3.8中,多处理模块现在提供了一个SharedMemory类,允许在不同的Python进程之间创建和共享内存区域。在以前的Python版本中,数据只能通过将数据写入文件、通过网络套接字发送或使用Python的pickle模块序列化来在进程之间共享。共享内存为在进程之间传递数据提供了更快的路径,使Python能够更有效地使用多个处理器和处理器内核。共享内存段可以分配为字节的原始区域,或者它们可以使用不可变的类似列表的对象来存储一小部分Python对象——数字类型、字符串、字节对象和None对象。对typing模块的改进Python是动态类型的,但支持通过typing模块使用类型提示,以允许第三方工具验证Python程序。Python3.8添加了新的类型元素以更可靠地检查:final装饰器和Final类型注释指示装饰/注释对象不应在任何地方被覆盖、子类化或重新分配。Literal类型将表达式限制为特定值或值列表,不一定是同一类型。TypedDict类型允许创建字典,其中与某些键关联的值被限制为一种或多种特定类型。请注意,这些限制仅限于可以在编译时而非运行时确定的内容。pickle协议的新版本Python的pickle模块提供了一种序列化和反序列化Python数据结构的方法,例如,允许将字典按原样保存到文件中并在以后重新加载它们。不同版本的Python支持不同级别的pickle协议,新版本支持更广泛的功能和更高效的序列化。随Python3.8引入的pickle版本5提供了一种新的方法来pickle实现Python缓冲区协议的对象,例如字节、内存视图或NumPy数组。新的pickle减少了必须为这些对象制作的内存副本的数量。NumPy和ApacheArrow等外部库在其Python绑定中支持新的pickle协议。新的pickle也可作为PyPI上Python3.6和Python3.7的附加组件使用。可逆字典Python中的字典在Python3.6中完全重写,使用PyPy项目提供的新实现。除了更快和更紧凑之外,字典现在还具有其元素的固有顺序;它们按添加顺序排列,就像列表一样。Python3.8允许在字典上使用reversed()。性能改进许多内置方法和函数的速度提高了20%到50%,因为其中许多方法和函数不必要地转换传递给它们的参数。一个新的操作码缓存可以加速解释器中的一些指令。然而,目前唯一实现的加速是LOAD_GLOBAL操作码,现在快了40%。类似的优化计划用于更高版本的Python。shutil.copyfile()和shutil.copytree()等文件复制操作现在使用特定于平台的调用和其他优化来加速操作。新创建的列表现在平均比以前小12%,这是由于使用列表构造函数对象的长度进行了优化(如果事先知道的话)。在Python3.8中,在新式类(例如类A(object))上写入类变量要快得多。operator.itemgetter()和collections.namedtuple()也有新的速度优化。PythonCAPI和CPython改进在最新版本的Python中,主要工作是重构CPython中使用的CAPI,CPython是用C编写的Python的参考实现。到目前为止,这项工作只产生了增量变化,但他们正在增加up:用于Python初始化配置的新CAPI允许对Python的初始化例程进行更严格的控制和更详细的反馈。这样可以更轻松地将Python运行时嵌入到您的应用程序中,并以编程方式将启动参数传递给Python。这个新的API还旨在确保所有Python的配置控件都有一个单一、一致的主页,以便可以更轻松地插入未来的更改(如Python的新UTF-8模式)。CPython的另一个新CAPI,“vectorcall”调用协议,允许更快地调用内部Python方法,而无需创建临时对象来处理调用。API仍然不稳定,但暂时可用。计划是从Python3.9开始完成它。Python运行时审计挂钩在Python运行时提供了两个API,用于挂钩事件并使它们可被外部工具(如测试框架或日志记录和审计系统)观察到。
