Python 3.8 中最好的新功能

Python 3.8是流行语言的最新版本,适用于从脚本编写和自动化到机器学习和Web开发的所有内容。 现在,在正式的beta版本中可用,Python 3.8带来了许多巧妙的语法更改,内存共享,更有效的序列化和反序列化,改进的词典等等。

自然地,Python 3.8也带来了各种性能改进。 总体结果是一个更快,更简洁,更一致且更现代的Python。 这是Python 3.8的新功能和最重要的功能。

赋值表达式

Python 3.8中最明显的变化是赋值表达式 ,它使用所谓的海象运算符( := )。 赋值表达式允许在表达式的上下文中而不是作为独立的语句将值分配给变量,甚至还不存在的变量。

while (line := file.readline()) != "end":
    print(chunk)

在此示例中,如果变量line不存在,则会创建该line ,然后从file.readline()分配值。 然后检查line以查看它是否等于"end" 。 如果不是,则读取下一行,将其存储在line ,进行测试,依此类推。

赋值表达式遵循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字符串格式提供了一种方便(且性能更高)的方式来在同一表达式中打印文本和计算值或变量:

x = 3 
print(f'{x+1}')

这将产生4

在f字符串表达式的末尾添加=将打印f字符串表达式本身的文本,后跟值:

x = 3
print (f'{x+1=}')

这将产生x+1=4

多处理共享内存

在Python 3.8中, multiprocessing模块现在提供了SharedMemory类 , 该类允许创建内存区域并在不同的Python进程之间共享。

在以前的Python版本中,只有在将数据写出到文件,通过网络套接字发送数据或使用Python的pickle模块对其进行序列化之后,才能在进程之间共享数据。 共享内存为在进程之间传递数据提供了一条更快的路径,从而使Python可以更有效地使用多个处理器和处理器核心。

共享内存段可以分配为字节的原始区域,也可以使用不可变的类似列表的对象,这些对象存储一小部分Python对象(数字类型,字符串,字节对象和None对象)。

打字模块改进

Python是动态类型化的,但是支持通过typing模块使用类型提示,以允许第三方工具验证Python程序。 Python 3.8在typing添加了新元素,以使更健壮的检查成为可能:

  • final装饰器和Final类型注释指示在任何时候都不应覆盖,注释或重新分配已装饰/带注释的对象。
  • Literal类型将表达式限制为特定值或值列表,不一定是同一类型。
  • 使用TypedDict类型 ,您可以创建字典,在其中将与某些键关联的值限制为一种或多种特定类型。 请注意,这些限制仅限于在编译时(而不是在运行时)确定的限制。

pickle协议的新版本

Python的pickle模块提供了一种序列化和反序列化Python数据结构的方法,例如,允许将字典按原样保存到文件中,并在以后重新加载。 不同版本的Python支持不同级别的pickle协议,而最新版本则支持更广泛的功能和更有效的序列化。

pickle版本5(随Python 3.8一起提供)提供了一种新方法,可对实现Python缓冲区协议的对象(例如字节,内存视图或NumPy数组)进行pickle。 新的pickle减少了必须为此类对象制作的内存副本的数量。

NumPy和Apache Arrow等外部库在其Python绑定中支持新的pickle协议。 新的pickle还可作为PyPI的Python 3.6和Python 3.7的附件使用。

可逆字典

使用PyPy项目提供的新实现,在Python 3.6中完全重写了Python中的字典。 除了更快,更紧凑之外,字典现在还具有其元素固有的排序方式。 它们是按添加顺序排序的,就像列表一样。 Python 3.8允许在字典上使用reversed()

运行时审核挂钩

如PEP 578中所述,运行时审核钩子允许CPython运行时执行的功能通过检测功能对Python代码可见。 这样,应用程序性能监视工具可以在函数调用级别上查看Python应用程序内部运行时发生的更多事情。

初始化配置

PEP 587允许CPython运行时通过C API对启动选项进行细粒度控制。 这样,可以比以前更精确地自定义Python的启动行为-例如,如果您以嵌入式方式使用Python,或者作为应用程序分发的独立运行时。

性能提升

  • 许多内置方法和函数的速度提高了20%至50%,因为其中许多不必要地转换了传递给它们的参数。
  • 新的操作码缓存可以加快解释器中的某些指令的速度。 但是,当前唯一实现的加速是针对LOAD_GLOBAL操作码的,现在加快了40%。 计划对更高版本的Python进行类似的优化。
  • 文件复制操作(例如shutil.copyfile()shutil.copytree()现在使用特定于平台的调用和其他优化来加快操作速度。
  • 现在,新创建的列表平均要比以前小12%,这要归功于优化方法,该方法利用了列表构造函数对象的长度(如果事先知道的话)。
  • 在Python 3.8中,对新型类(例如, class A(object) )的类变量进行写操作要快得多。
  • 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( “矢量调用”调用协议 )允许更快地调用内部Python方法,而无需创建用于处理该调用的临时对象的开销。 该API仍然不稳定,但是已经临时可用。 计划从Python 3.9起完成。
  • Python运行时审核挂钩在Python运行时中提供了两个API,用于挂钩事件并使事件对外部工具(如测试框架或日志记录和审核系统)可见。

在哪里下载Python 3.8

您可以从Python Software Foundation 下载Python 3.8 beta 。

From: https://www.infoworld.com/article/3400640/the-best-new-features-in-python-38.html

你可能感兴趣的:(Python 3.8 中最好的新功能)