所以,我有一个大的numpy数组(超过1000万个元素甚至更多) 然后我有一个循环,它访问大型数组。
在每次迭代中,循环遍历一个相邻索引列表,从numpy数组中检索值。 目前,我采取一个大数组,然后检索值。
例如:
循环需要访问[1000, 1000], [1001, 1000], [1002,999]
它将采用array[1000:1003, 999 : 1001]
的切片,然后访问元素。
这会降低循环的性能,还是增加它(理论上)?
答案 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;时间将超过索引时间。
但是我鼓励你设置一个测试用例,然后尝试替代方案。看看自己有什么不同。