對於一個很大的列表,如果要對其進行復制,那麼有三種方式可以選擇。
第一種是直接用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