python – Is there a difference between using a dict literal and a dict constructor?

python – Is there a difference between using a dict literal and a dict constructor?

I think you have pointed out the most obvious difference. Apart from that,

the first doesnt need to lookup dict which should make it a tiny bit faster

the second looks up dict in locals() and then globals() and the finds the builtin, so you can switch the behaviour by defining a local called dict for example although I cant think of anywhere this would be a good idea apart from maybe when debugging

Literal is much faster, since it uses optimized BUILD_MAP and STORE_MAP opcodes rather than generic CALL_FUNCTION:

> python2.7 -m timeit d = dict(a=1, b=2, c=3, d=4, e=5)
1000000 loops, best of 3: 0.958 usec per loop

> python2.7 -m timeit d = {a:1, b:2, c:3, d:4, e:5}
1000000 loops, best of 3: 0.479 usec per loop

> python3.2 -m timeit d = dict(a=1, b=2, c=3, d=4, e=5)
1000000 loops, best of 3: 0.975 usec per loop

> python3.2 -m timeit d = {a:1, b:2, c:3, d:4, e:5}
1000000 loops, best of 3: 0.409 usec per loop

python – Is there a difference between using a dict literal and a dict constructor?

They look pretty much the same on Python 3.2.

As gnibbler pointed out, the first doesnt need to lookup dict, which should make it a tiny bit faster.

>>> def literal():
...   d = {one: 1, two: 2}
...
>>> def constructor():
...   d = dict(one=1, two=2)
...
>>> import dis
>>> dis.dis(literal)
  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 (one)
              9 STORE_MAP
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 (two)
             16 STORE_MAP
             17 STORE_FAST               0 (d)
             20 LOAD_CONST               0 (None)
             23 RETURN_VALUE
>>> dis.dis(constructor)
  2           0 LOAD_GLOBAL              0 (dict)
              3 LOAD_CONST               1 (one)
              6 LOAD_CONST               2 (1)
              9 LOAD_CONST               3 (two)
             12 LOAD_CONST               4 (2)
             15 CALL_FUNCTION          512
             18 STORE_FAST               0 (d)
             21 LOAD_CONST               0 (None)
             24 RETURN_VALUE

Leave a Reply

Your email address will not be published. Required fields are marked *