Python dictionary deepcopy

后端 未结 2 1988
一向
一向 2020-12-30 00:46

I was wondering in how does exactly deepcopy work in the following context:

from copy import deepcopy

def copyExample:
    self.myDict = {}
    firstPositio         


        
2条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-12-30 01:25

    I know it isn't answering your question but I think it's noteworthy for people looking at this question.

    If the data you're copying is simple in nature deepcopy might be overkill. With simple in nature I mean if your data is representable as Json. Let me illustrate with code:

    I've used http://www.json-generator.com/ to get some sample json data.

    def deepCopyList(inp):
        for vl in inp:
            if isinstance(vl, list):
                yield list(deepCopyList(vl))
            elif isinstance(vl, dict):
                yield deepCopyDict(vl)
    
    def deepCopyDict(inp):
        outp = inp.copy()
        for ky, vl in outp.iteritems():
            if isinstance(vl, dict):
                outp[ky] = deepCopyDict(vl)      
            elif isinstance(vl, list):
                outp[ky] = list(deepCopyList(vl))  
        return outp
    
    def simpleDeepCopy(inp):
        if isinstance(inp, dict):
            return deepCopyDict(inp)
        elif isinstance(inp, list):
            return deepCopyList(inp)
        else:
            return inp
    
    if __name__ == '__main__':
        import simplejson as json
        import time
        from copy import deepcopy
        fl = open('sample.json', 'r')
        sample = json.load(fl)
        start = time.time()
        for _ in xrange(10000):
            tmp = simpleDeepCopy(sample)
        end = time.time()
        print 'simpleDeepCopy: ' + str(end - start)
        start = time.time()
        for _ in xrange(10000):
            tmp = deepcopy(sample)
        end = time.time()
        print 'copy.deepcopy: ' + str(end - start)
    

    output:

    simpleDeepCopy: 0.0132050514221
    copy.deepcopy: 2.66142916679
    
    simpleDeepCopy: 0.0128579139709
    copy.deepcopy: 2.60736298561
    

提交回复
热议问题