python列表的三种拷贝方式的性能分析

对于一个很大的列表,如果要对其进行复制,那么有三种方式可以选择。

第一种是直接用for循环复制,第二、第三种则是使用python自带的copy和deepcopy方法。

copy和deepcopy的区别在于,copy仅仅对被复制对象本身的值进行复制,而deepcopy则还会对被复制对象的所有子对象进行递归和拷贝。举例来说,如果一个字典里的value里包含了列表,那么在复制这个字典时,deepcopy也会把引用的列表复制一遍。为了避免对自身的引用导致无限递归,deepcopy还用到了memo 保存着所有拷贝过的对象,因此速度很慢。

所以,能不用deepcopy尽量不用。下面的代码计算了运行时间的差异。

 

import time
from copy import copy, deepcopy

N = 1000000
L = [i for i in range(N)]

start = time.clock()
L_c1 = [i for i in L]
t1 = time.clock()
L_c2 = copy(L)
t2 = time.clock()
L_c3 = deepcopy(L)
t3 = time.clock()

elapsed1 = (t1 - start)
elapsed2 = (t2 - t1)
elapsed3 = (t3 - t2)
print('for: {}'.format(elapsed1*1000))
print('copy: {}'.format(elapsed2*1000))
print('deepcopy: {}'.format(elapsed3*1000))

输出结果为:

for: 56.50506347205919
copy: 11.88556008469277
deepcopy: 850.4813199843966

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章