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 ms
Python 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
模块中的 mean
、variance
与stdev
函数 。如果入参是一个迭代器 , 则会直接用于计算,而不是先将其转换为列表 。这种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 us
Python 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 ns
Python 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 项目带来的优化点 。敬请期待!
推荐阅读
- 微信好友删除了怎么找回(微信注销60天后警察还能查到吗)
- 只知道微信昵称删除了对方怎么找对方(彻底删除对方微信)
- 微信删除好友怎么找回(微信已经实行双向删除了吗)
- 微信读书有声书怎么查看
- RAID5 IO处理之条带读代码详解
- Learning Records 计算机网络
- 重写 hashcode真有那么简单嘛?
- 遇到这样的女人一定要把握住,除了重感情心里还非常的善良豁达
- 万万没有想到老鹰不是食物链顶端,经常被猫头鹰捕食,你怎么看?
- 除了 三高检查大概要多少钱