Numpy数组访问优化

时间:2017-03-21 17:00:34

标签: python arrays performance numpy

所以,我有一个大的numpy数组(超过1000万个元素甚至更多) 然后我有一个循环,它访问大型数组。

在每次迭代中,循环遍历一个相邻索引列表,从numpy数组中检索值。 目前,我采取一个大数组,然后检索值。

例如: 循环需要访问[1000, 1000], [1001, 1000], [1002,999] 它将采用array[1000:1003, 999 : 1001]的切片,然后访问元素。

这会降低循环的性能,还是增加它(理论上)?

2 个答案:

答案 0 :(得分:1)

根据我的记忆,切片完成后将列表部分复制到内存中。我不确定,但我几乎可以肯定这个操作是O(1)。但是直接进行,比如

container = [] for i in range(a,b): container.append(l[i])

通常会更快。

答案 1 :(得分:1)

arr1 = arr[1000:1003, 999 : 1001]view arr。这意味着它是一个新的数组对象,具有自己的形状和步幅,但它与arr共享数据缓冲区。 (我可以详细了解它如何分享'但我认为这不重要。)

arr[1000, 1000]arr[1001, 1000]arr[1002,999]arr的个别元素。 arr1[0,1]arr1[1,1]arr1[2,0]引用相同的元素(如果我已经完成了数学运算)。我有根据的猜测是访问时间是一样的。

这三个元素可以一次获取,一个副本,

arr2 = arr[[1000, 1001, 1002],[1000, 1000, 999]]

我希望

for x in arr:
   <do something with x>

会比

更快
for idx in [[1000, 1000], [1001, 1000], [1002,999]]:
    x = arr[idx]
    <do something with x>

但很可能“做某事”&#39;时间将超过索引时间。

但是我鼓励你设置一个测试用例,然后尝试替代方案。看看自己有什么不同。