在Python中,创建新数组与就地数组操作哪个更高效?
假设我有一个包含几百个元素的数组。我需要遍历这个数组,把一个或多个元素替换成其他的某个元素。在速度方面,哪种方法在Python中更有效率(我不太关心内存)?
举个例子:我有一个数组
my_array = [1,2,3,4,5,6]
我想把前3个元素替换成一个值为123的元素。
选项1(直接替换):
my_array = [1,2,3,4,5,6]
my_array.remove(0,3)
my_array.insert(0,123)
选项2(创建新数组):
my_array = [1,2,3,4,5,6]
my_array = my_array[3:]
my_array.insert(0,123)
以上两种方法都会得到以下结果:
>>> [123,4,5,6]
任何评论都很受欢迎,特别是如果有我遗漏的选项。
4 个回答
0
如果你想要快速高效地处理一系列整数,建议你使用标准的数组模块:
>>> import array
>>> my_array = array.array('i', [1,2,3,4,5,6])
>>> my_array = my_array[3:]
>>> my_array.insert(0,123)
>>> my_array
array('i', [123, 4, 5, 6])
3
arr[0] = x
这个操作会把第一个元素替换成x。你也可以替换一整块数据。
>>> arr = [1, 2, 3, 4, 5, 6]
>>> arr[0:3] = [8, 9, 99]
>>> arr
[8, 9, 99, 4, 5, 6]
>>>
不过,通常来说,大家不太明白你想要达到什么效果。请提供更多信息或者一个例子。
好的,关于你的更新。remove
这个方法不太好用(因为它需要一个参数)。但是我之前提到的切片方法在你的情况下也能用:
>>> arr
[8, 9, 99, 4, 5, 6]
>>> arr[0:3] = [4]
>>> arr
[4, 4, 5, 6]
我猜这个方法是最快的,不过你可以用timeit
来测试一下。根据我的测试,它的速度是你“新数组”方法的两倍。
6
如果你想在一个列表中替换某个项目或者一组项目,千万不要用你最初想到的方法。在列表中间删除和添加东西是比较慢的(参考资料)。而你第二个想法也不太高效,因为你要进行两次操作才能完成一次替换。
相反,按照eiben的回答,直接使用切片赋值。这种方法会比你之前的两种方法快得多,也更有效率:
>>> my_array = [1,2,3,4,5,6]
>>> my_array[:3] = [123]
>>> my_array
[123, 4, 5, 6]