写点什么

Python deepcopy 一个优化

用户头像
么么哒
关注
发布于: 2020 年 05 月 29 日
Python deepcopy一个优化

在项目中有很多地方使用到了python的deepcopy,一旦数据操作次数多了的时候就会出现性能急剧下降。因为deepcopy这种会拷贝对象所有的信息。但是用shallow copy又有数据更新问题。后来就使用循环赋值构造新的对象代替deepcopy,速度也可以。

_dispatcher = {}
def _copy_list(_l):
ret = _l.copy()
for idx, item in enumerate(ret):
cp = _dispatcher.get(type(item))
if cp is not None:
ret[idx] = cp(item)
return ret
_dispatcher[list] = _copy_list
def _copy_dict(d):
ret = d.copy()
for key, value in ret.items():
cp = _dispatcher.get(type(value))
if cp is not None:
ret[key] = cp(value)
return ret
_dispatcher[dict] = _copy_dict
def deepcopy(sth):
cp = _dispatcher.get(type(sth))
if cp is None:
return sth
else:
return cp(sth)



对比测试

In [35]: x = [[0]*1000 for i in range(1000)]
In [36]: %timeit copy.deepcopy(x)
520 ms ± 5.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [37]: %timeit deepcopy(x)
173 ms ± 3.08 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)



In [38]: y = {i:i+1 for i in range(1000)}
In [39]: %timeit copy.deepcopy(y)
1.05 ms ± 16.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [40]: %timeit deepcopy(y)
153 µs ± 854 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

对比看起来速度还是提升不少的。

发布于: 2020 年 05 月 29 日阅读数: 74
用户头像

么么哒

关注

还未添加个人签名 2018.03.15 加入

还未添加个人简介

评论

发布
暂无评论
Python deepcopy一个优化