最近,我不得不将字典的值转换为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应该建议较慢的版本。
所以我的问题出现了:后一版本与第一版相比的优势是什么?
答案 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()
内置函数的成本。在大多数实际情况中,这个数字可以忽略不计。