没有语义差异。这个
dict(enumerate(seq))
会执行得更快。
更新:好吧,似乎更快可能不像我预期的那样明确..(或正确,除了可能是 3.9b1 - 请参阅@Bharel 的回答)。
Update2:为了完整性,我已经为来自 @ShadowRanger 的 dict 理解解决方案添加了测量值。
Py2.7:
(dev) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "dict(enumerate(seq))"
1000000 loops, best of 3: 1.06 usec per loop
(dev) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
1000000 loops, best of 3: 0.686 usec per loop
(dev) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "{a: b for a,b in enumerate(seq)}"
1000000 loops, best of 3: 0.807 usec per loop
Py3.5:
(dev35) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "dict(enumerate(seq))"
1000000 loops, best of 3: 1.19 usec per loop
(dev35) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
1000000 loops, best of 3: 0.813 usec per loop
(dev35) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "{a: b for a,b in enumerate(seq)}"
1000000 loops, best of 3: 0.917 usec per loop
Py3.8:
(dev38) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "dict(enumerate(seq))"
500000 loops, best of 5: 755 nsec per loop
(dev38) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
500000 loops, best of 5: 703 nsec per loop
(dev38) c:\srv> python -m timeit -s "seq = ['a', 'b', 'c']" "{a: b for a,b in enumerate(seq)}"
500000 loops, best of 5: 879 nsec per loop
更新 3: @Bharel 和 @ShadowRanger 指出,列表的长度很重要。 dict(enumerate(..)) 版本的列表大约有 10 个项目,性能更高。
代码:
call workon dev
python -m timeit -s "seq = 'abcdefghij'" "dict(enumerate(seq))"
python -m timeit -s "seq = 'abcdefghij'" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
call workon dev35
python -m timeit -s "seq = 'abcdefghij'" "dict(enumerate(seq))"
python -m timeit -s "seq = 'abcdefghij'" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
call workon dev38
python -m timeit -s "seq = 'abcdefghij'" "dict(enumerate(seq))"
python -m timeit -s "seq = 'abcdefghij'" "index = {}" "for a,b in enumerate(seq):" " index[a]= b"
输出:
100000 loops, best of 3: 1.94 usec per loop
1000000 loops, best of 3: 1.9 usec per loop
1000000 loops, best of 3: 1.7 usec per loop
1000000 loops, best of 3: 1.6 usec per loop
200000 loops, best of 5: 1.29 usec per loop
200000 loops, best of 5: 1.66 usec per loop