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

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

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

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

所以,能不用deepcopy尽量不用。但是有一种容易出错的情况是关于二维列表的拷贝,不能使用copy方法。

下面的代码计算了运行时间的差异。

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值