Fast way to copy dictionary in Python

后端 未结 6 958
广开言路
广开言路 2020-12-02 11:14

I have a Python program that works with dictionaries a lot. I have to make copies of dictionaries thousands of times. I need a copy of both the keys and the associated conte

相关标签:
6条回答
  • 2020-12-02 11:29

    Appearantly dict.copy is faster, as you say.

    [utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = d.copy()"
    1000000 loops, best of 3: 0.238 usec per loop
    [utdmr@utdmr-arch ~]$ python -m timeit -s "d={1:1, 2:2, 3:3}" "new = dict(d)"
    1000000 loops, best of 3: 0.621 usec per loop
    [utdmr@utdmr-arch ~]$ python -m timeit -s "from copy import copy; d={1:1, 2:2, 3:3}" "new = copy(d)"
    1000000 loops, best of 3: 1.58 usec per loop
    
    0 讨论(0)
  • 2020-12-02 11:31

    Can you provide a code sample so I can see how you are using copy() and in what context?

    You could use

    new = dict(old)
    

    But I dont think it will be faster.

    0 讨论(0)
  • 2020-12-02 11:31

    The measurments are dependent on the dictionary size though. For 10000 entries copy(d) and d.copy() are almost the same.

    a = {b: b for b in range(10000)} 
    In [5]: %timeit copy(a)
    10000 loops, best of 3: 186 µs per loop
    In [6]: %timeit deepcopy(a)
    100 loops, best of 3: 14.1 ms per loop
    In [7]: %timeit a.copy()
    1000 loops, best of 3: 180 µs per loop
    
    0 讨论(0)
  • 2020-12-02 11:39

    Looking at the C source for the Python dict operations, you can see that they do a pretty naive (but efficient) copy. It essentially boils down to a call to PyDict_Merge:

    PyDict_Merge(PyObject *a, PyObject *b, int override)
    

    This does the quick checks for things like if they're the same object and if they've got objects in them. After that it does a generous one-time resize/alloc to the target dict and then copies the elements one by one. I don't see you getting much faster than the built-in copy().

    0 讨论(0)
  • 2020-12-02 11:44

    Depending on things you leave to speculation, you may want to wrap the original dictionary and do a sort of copy-on-write.

    The "copy" is then a dictionary which looks up stuff in the "parent" dictionary, if it doesn't already contain the key --- but stuffs modifications in itself.

    This assumes that you won't be modifying the original and that the extra lookups don't end up costing more.

    0 讨论(0)
  • 2020-12-02 11:45

    I realise this is an old thread, but this is a high result in search engines for "dict copy python", and the top result for "dict copy performance", and I believe this is relevant.

    From Python 3.7, newDict = oldDict.copy() is up to 5.5x faster than it was previously. Notably, right now, newDict = dict(oldDict) does not seem to have this performance increase.

    There is a little more information here.

    0 讨论(0)
提交回复
热议问题