gpt4 book ai didi

python - PEP 3106 建议更慢的方式?为什么?

转载 作者:太空狗 更新时间:2023-10-30 00:42:39 25 4
gpt4 key购买 nike

最近,我不得不将字典的值转换为 Python 3.6 中的列表,这是一个应该经常发生的用例。
为了成为一个好人,我想使用接近 PEP 的解决方案。现在,PEP 3106 建议

list(d.keys())

这显然工作正常 - 但是我看到在我的 Windows 7 机器上使用 timeit

>python -m timeit "[*{'a': 1, 'b': 2}.values()]"
1000000 loops, best of 3: 0.249 usec per loop

>python -m timeit "list({'a': 1, 'b': 2}.values())"
1000000 loops, best of 3: 0.362 usec per loop

我认为后一个版本有优势,否则 PEP 为什么要建议较慢的版本。

那么我的问题来了:与第一个版本相比,后一个版本有什么优势?

最佳答案

答案是因为更快的语法是在 PEP 448 中首次引入的在 2013 年,同时 PEP 3106您的引用文献是在 2006 年编写的,所以即使现在确实更快,但在编写 PEP 时它并不存在。

正如其他人所指出的,PEP 的作用不是为尽可能快的代码提供模板 - 一般来说,PEP 中的代码将旨在尽可能简单和清晰,因为示例通常是关于理解概念而不是实现最佳结果,因此即使当时确实存在语法,并且以真实(可靠)的方式更快,它仍然可能没有被使用。

用更大的值进行一些进一步的测试:

python -m timeit -s "x = [1]*10000" "[*x]"                
10000 loops, best of 3: 44.6 usec per loop

python -m timeit -s "x = [1]*10000" "list(x)"
10000 loops, best of 3: 44.8 usec per loop

显示差异并不是真正的两倍,而是固定成本 - 我猜这是查找 list() 内置函数的成本。在大多数实际情况下,这可以忽略不计。

关于python - PEP 3106 建议更慢的方式?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49384233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com