Skip to content

Py3.6与py3.4的差异

py3.6与py3.4的差异

python3.5新增特性

新语法特性

  • PEP492,支持async/await语法的异步协同。优化了Python的异步,添加了awaitable object 、协程函数、异步迭代和异步上下文管理器等。
  • PEP465,新增矩阵乘法运算符’@’。 a @ b表示矩阵a乘矩阵b,也支持a @= b。
  • PEP448,解包操作更加方便。 作为可迭代的解包操作符,* 作为字典的解包操作符。list,tuple等数据结构通过解包操作会得到分散的对象,例如,*range(4), 4结果得到(0, 1, 2, 3, 4)

新模块特性

  • PEP484,新增typing模块,类型注释的新标准。支持通过def greeting(name: str) -> str:这种形式声明函数,来注释输入和输出地数据类型。
  • PEP441,优化Python对zip压缩包的支持。从2.6版本开始,Python支持将文件或zip形式的压缩包作为脚本执行,对于有必要作为一个文件发布又复杂到要分模块管理的应用来说,这个功能很实用。但是这个功能却鲜有人知,原因之一是当时没有很好地宣传,只在What’s New中提到,没有写到文档中;原因之二是Windows没有为这种形式的文件(.zip)提供相应地Python扩展名(类似.py)。所以这一次的版本中重新发布了这个特性,并且,定义.pyz和.pyzw作为“Python的zip应用”和“Windows下Python Zip应用”的扩展名,并提供了一个简单的管理工具。
  • PEP485,新增math.isclose(),来判断近似相等。abs(a-b) <= max( rel_tol * max(abs(a), abs(b)), abs_tol )

新的内置功能

  • PEP461,%操作符支持对字节和字节数组的格式化。
  • bytes、bytearray和memoryview新增hex()方法,返回十六进制字符串。
  • memoryview现在支持元组索引(包括多维)。
  • 生成器有一个新的gi_yieldfrom属性,它返回被yield from表达式迭代的对象。
  • 当达到最大递归深度时,抛出新RecursionError异常。
  • PEP475,提供系统调用中断时自动重试的支持。
  • PEP479,StopIteration异常改在生成器内部处理。现在如果生成器raise一个StopIteration,将会替换为RuntimeError。因为这个特性不能向前兼容,所以最初是以future的形式发布的。当前StopIteration异常表明生成器的循环结构的迭代结束.

CPython实现改进

  • 当LC_TYPE local是POSIX local(C local),sys.stdin和sys.stdout使用surrogateescape错误处理程序,而不是strict错误处理程序。
  • PEP488,不再使用.pyo文件名。.pyc如果添加优化参数,生成的.pyc文件名字中会保存优化级别。(eg: foo.cpython-35.opt-1.pyc)
  • PEP489,优化内置模块和扩展模块的加载。

标准程序库重要优化

  • collections.OrderedDict用C重写,速度提高4-100倍。
  • ssl模块支持Memory BIO,它将SSL协议处理与网络IO分离。
  • PEP471,新增os.scandir(),能够快速遍历目录。
  • functools.lru_cache()用C重写,性能大大提升。
  • 新增subprocess.run()函数,提供一种简化的方法来运行子进程。
  • traceback模块优化,性能更高,对开发者更加友好。

安全优化

  • SSLv3现在在标准库中已禁用。仍然可以通过手动实例化ssl.SSLContext启用。
  • HTTP cookie解析现在更加严格,以防止潜在的注入攻击。

python3.6新增特性

新语法特性

  • PEP498,格式化字符串字面量。格式化字符串带 'f' 前缀,类似于 str.format() 接受的格式字符串。它们包含了由花括号括起来的替换字段。替换字段是表达式,它们会在运行时计算,然后使用 format() 协议进行格式化。
  • PEP515,数字字面量中的下划线。添加了在数字字面量中使用下划线的能力,以提高可读性。(eg: 1_000_000_000_000_000)
  • PEP526,变量注解中的语法。添加了用来注释变量(包括类变量和实例变量)类型的语法。
  • PEP525,异步生成器。解除不能在同一个函数中使用await 和 yield的限制,使定义异步生成器成为可能。
  • PEP520,异步解析式。添加了对 async for 在list、set、dict解析式以及generator表达式中的使用支持。

新库模块

  • PEP506,在标准库中添加了Secrets模块。提供一个显式可靠的方式来产生适合于管理诸如账户认证,令牌之类的保密信息的加密的强伪随机值。

CPython实现的改进:

  • 重新实现了字典(dict)类型,以便能像PyPy的字典类型一样使用更紧凑的表达方式。与Python 3.5相比,这使字典的内存用量减少了20%到25%。
  • 用新协定优化了类的自定义建立。可以在不使用元类的情况下自定义子类。每当创建一个新的子类时,新的 __init_subclass__ 类方法将在基类上被调用。
  • 类属性定义顺序(class attribute definition order)现在被保留了。类的定义体中的属性有一个自然顺序:即源码中属性名出现的顺序。 这个顺序现在保存在新的类 __dict__ 的属性中.
  • **kwargs内的元素顺序现在对应于将关键字(保留字)参数传递给函数的顺序。函数声明中的**kwargs的顺序现在被保证是插入顺序的映射。
  • 新增了对DTrace和SystemTap probing的支持。Python现在可以使用 --with-dtrace 来构建,它为解释器中的以下事件启用了静态标志器:函数调用/返回、垃圾回收开始/结束、执行代码行。这可以被用来检测生产中运行的解释器,而无需重新编译指定调试构建,或者提供应用特有的配置/调试代码。
  • 新PYTHONMALLOC环境变量现在可用于调试解释器内存分配与访问错误。

标准库的重大改进:

  • 为asyncio模块开发了新功能,显著的可用性、性能优化,以及大量的错误修复。 从Python 3.6开始,asyncio模块不再是临时的了,其API也进入了稳定状态。
  • 实现了用于支持类路径对象(path-like objects)的新文件系统路径协议。 所有在路径(path)上使用的标准库函数都已更新,以便适应于新协议。
  • datetime模块已获得对本地时间消歧(Local Time Disambiguation)的支持。
  • 针对typing模块的一些改进,使其不再是临时模块。
  • tracemalloc模块已重大改进,现用于为ResourceWarning提供更好的输出,并为内存分配错误提供更好的诊断。

安全相关的改进:

  • 新secrets模块被用于简化那些适用于管理密文的密码学安全伪随机数生成器(cryptographically strong pseudo-random numbers)的生成过程,如认证、token等。
  • 在Linux上,现将os.urandom()改成了阻塞模式,直到系统的urandom的熵池(entropy pool)的初始化具有更高的安全性。 解释请参见PEP 524。
  • hashlib 和 ssl 模块现已支持OpenSSL 1.1.0。
  • 改进了 ssl模块 的默认设置和特性集。
  • 新增了 hashlib模块 对BLAKE2、SHA-3、SHAKE哈希算法以及 scrypt() 密钥导出函数的支持。