Python 3.8新功能盘点:更快 更简洁 更一致 更现代化

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