Python deepcopy()与仅仅启动一个numpy数组的运行时速度相比?
我很好奇Python deepcopy()与仅仅启动一个numpy数组的运行时速度相比?,python,arrays,numpy,copy,deep-copy,Python,Arrays,Numpy,Copy,Deep Copy,我很好奇 elevation_arr = numpy.zeros([900, 1600], numpy.float32) climate_arr = copy.deepcopy(elevation_arr) rainfall_arr = copy.deepcopy(elevation_arr) 执行速度比 elevation_arr = numpy.zeros([900, 1600], numpy.float32) climate_arr = numpy.zeros([900, 1600],
elevation_arr = numpy.zeros([900, 1600], numpy.float32)
climate_arr = copy.deepcopy(elevation_arr)
rainfall_arr = copy.deepcopy(elevation_arr)
执行速度比
elevation_arr = numpy.zeros([900, 1600], numpy.float32)
climate_arr = numpy.zeros([900, 1600], numpy.float32)
rainfall_arr = numpy.zeros([900, 1600], numpy.float32)
numpy_zeros
对于较小的阵列性能稍好,对于较大的阵列性能更好,如下所示
import copy
import numpy as np
def deep_copy():
elevation_arr = np.zeros([900, 1600], np.float32)
climate_arr = copy.deepcopy(elevation_arr)
rainfall_arr = copy.deepcopy(elevation_arr)
return
def numpy_zeros():
elevation_arr = np.zeros([900, 1600], np.float32)
climate_arr = np.zeros([900, 1600], np.float32)
rainfall_arr = np.zeros([900, 1600], np.float32)
return
%timeit deep_copy()
# 4.13 ms ± 585 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit numpy_zeros()
# 3.01 ms ± 195 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
对于10000 x 10000阵列,以下是计时<代码>numpy_零的性能优于
%timeit deep_copy()
# 569 ms ± 50 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit numpy_zeros()
# 15.6 µs ± 1.38 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
我不知道你能为这样的事情计时,谢谢。使用
copy..deepcopy()
有什么特别的原因吗?我认为elevation\u arr.copy()
无论如何都等同于深度复制,因为elevation\u arr
的元素是不可变的int。@fountainhead我想确保这些值不会是引用。我不知道不可变的值会这样工作。它们在技术上是浮动的,不是吗?没错,它们是float32s
。但是不可变,就像ints
一样。我的观点是,给定一个由许多对象组成的聚合数据结构(在本例中为numpy数组),如果聚合中的对象都是不可变的,那么浅层副本就足够了。只有当对象是可变的时,通过复制元素本身,使副本成为深层副本才变得重要。@fountainhead哦,我明白了。谢谢我不知道。对于像你这样的数组:copy.copy(arr)
,copy.deepcopy(arr)
,arr.copy()
,np.array(arr,copy=True)
deepcopy
只有在数组具有对象数据类型(与列表包含列表或字典时相同)时才会显著不同。