* One more improvement is that the previous popcount-based code fo。万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!( 三 )。" />

万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!( 三 )

n ^ k ^ (n - k). python/blob/03dccc557adf39db0150410e7c448ff3164e7022/Modules/mathmodule.c#L3583" rel="external nofollow noreferrer">*
One more improvement is that the previous popcount-based code for computing the largest power of two dividing math.comb(n, k) (for small n) got replaced with a more direct method based on counting trailing zeros of the factorials involved. (python/cpython/pull/30313#issue-1091542983" rel="external nofollow noreferrer">*).
Python 3.10:
$ python -m pyperf timeit -s \'import math' -- 'math.comb(100, 55)'.....................Mean +- std dev: 3.72 us +- 0.07 us# ---$ python -m pyperf timeit -s \'import math' -- 'math.comb(10000, 5500)'.....................Mean +- std dev: 11.9 ms +- 0.1 msPython 3.11:
$ python -m pyperf timeit -s \'import math' -- 'math.comb(100, 55)'.....................Mean +- std dev: 476 ns +- 20 ns# ---$ python -m pyperf timeit -s \'import math' -- 'math.comb(10000, 5500)'.....................Mean +- std dev: 2.28 ms +- 0.10 ms对于 statistics 库:优化了 mean(data)、variance(data, xbar=None) 与 stdev(data, xbar=None)3.11 优化了statistics模块中的 meanvariancestdev 函数 。如果入参是一个迭代器 , 则会直接用于计算,而不是先将其转换为列表 。这种python/blob/208abcd8f1726646f8d86306616b0db802d8064c/Lib/statistics.py#L205" rel="external nofollow noreferrer">计算方法 的速度比之前的快了一倍 。python.org/3/whatsnew/changelog.html" rel="external nofollow noreferrer">*
Python 3.10:
# Mean$ python -m pyperf timeit -s \'import statistics' -- 'statistics.mean(range(1_000))'.....................Mean +- std dev: 255 us +- 11 us# Variance$ python -m pyperf timeit -s \'import statistics' -- 'statistics.variance((x * 0.1 for x in range(0, 10)))'.....................Mean +- std dev: 77.0 us +- 2.9 us# Sample standard deviation (stdev)$ python -m pyperf timeit -s \'import statistics' -- 'statistics.stdev((x * 0.1 for x in range(0, 10)))'.....................Mean +- std dev: 78.0 us +- 2.2 usPython 3.11:
# Mean$ python -m pyperf timeit -s \'import statistics' -- 'statistics.mean(range(1_000))'.....................Mean +- std dev: 193 us +- 7 us# Variance$ python -m pyperf timeit -s \'import statistics' -- 'statistics.variance((x * 0.1 for x in range(0, 10)))'.....................Mean +- std dev: 56.1 us +- 2.3 us# Sample standard deviation (stdev)$ python -m pyperf timeit -s \'import statistics' -- 'statistics.stdev((x * 0.1 for x in range(0, 10)))'.....................Mean +- std dev: 59.4 us +- 2.6 us纯 ASCII 字符串的 unicodedata.normalize(),提升到常数时间对于 unicodedata.normalize() 方法 , 如果提供的入参是纯 ASCII 字符串 , 则通过 unicode 快速检查算法 迅速返回结果 。这项检查使用的是PyUnicode_IS_ASCII 实现 。
Python 3.10:
$ python -m pyperf timeit -s \'import unicodedata' -- 'unicodedata.normalize("NFC", "python")'.....................Mean +- std dev: 83.3 ns +- 4.3 nsPython 3.11:
$ python -m pyperf timeit -s \'import unicodedata' -- 'unicodedata.normalize("NFC", "python")'.....................Mean +- std dev: 34.2 ns +- 1.2 ns最后的话:

  • 我写这篇文章是为了加深自己对 Python 3.11 最新成果的认识 。如果内容有错,请通过email 或者 Twitter告诉我 。(译注:本翻译是出于促进自己学习及加强理解的目的,若有错漏,欢迎指正?。?/li>
  • 附 HackerNews 上的评论
  • 在下一篇文章中 , 我将分析 faster CPython 项目带来的优化点 。敬请期待!
【万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!】

推荐阅读