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

 

 

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