PEP 3106建议慢一点?为什么?

时间:2018-03-20 12:27:28

标签: python python-3.x pep

最近,我不得不将字典的值转换为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应该建议较慢的版本。

所以我的问题出现了:后一版本与第一版相比的优势是什么?

1 个答案:

答案 0 :(得分:9)

答案是因为2013年在PEP 448中首次引入了更快的语法,而你引用的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()内置函数的成本。在大多数实际情况中,这个数字可以忽略不计。