Loops 对于高维数组,使用数组访问的循环速度较慢
我在中描述并解决了相同的问题,其中julia循环由于使用非最佳变量类型重复访问内存而大大减慢。但在我的例子中,张量(维数大于2)存储为多维数组,需要在for循环中反复求和,类似于:Loops 对于高维数组,使用数组访问的循环速度较慢,loops,multidimensional-array,julia,tensor,Loops,Multidimensional Array,Julia,Tensor,我在中描述并解决了相同的问题,其中julia循环由于使用非最佳变量类型重复访问内存而大大减慢。但在我的例子中,张量(维数大于2)存储为多维数组,需要在for循环中反复求和,类似于: function randomTensor(M,N) T = fill( zeros( M, M, M, M) , N) for i in 1 : N Ti = rand( M, M, M, M) T[i] += Ti end return T end
function randomTensor(M,N)
T = fill( zeros( M, M, M, M) , N)
for i in 1 : N
Ti = rand( M, M, M, M)
T[i] += Ti
end
return T
end
我是Julia的新手(事实上,我只是在一个特定的项目中使用它,我需要一些Julia模块),所以我对变量类型等只有一般的理解,直到现在我还不能定义我的张量,如果不是一般数组的话。我想要一个在前面的链接中提出的解决方案,他们使用Matrix{Float64}[]
来定义变量,但显然这只适用于一维或二维数组。也不能使用元组,因为我需要对值求和。对于不同的实现有什么建议吗
提前谢谢大家
编辑:我发布的示例代码只是一个与我的代码结构相同的示例,我对生成和求和随机数不感兴趣:)
换句话说,我的问题是:有没有比数组{Float,N}更好的变量类型来执行操作(例如,张量乘以标量…)或者对内存有“更好的访问能力”?问题是什么还不清楚。您的功能相当于:
randomTensor(M,N) = [rand(M, M, M, M) for i in 1:N]
你是说这太慢了?大部分时间应该用于创建随机数和为输出分配内存。根据
M
的大小,您可能会注意到使用+=
而不是+=
的一些优势。原因是x+=y
完全等同于x=x+y
,包括分配一个新数组来保存结果。相反,x.+=y
已就位。您可以通过以下方式自己看到这一点:
julia> a = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> pointer(a)
Ptr{Int64} @0x00007fa007d2c980
julia> a += a
3-element Vector{Int64}:
2
4
6
julia> pointer(a)
Ptr{Int64} @0x00007fa02a06eac0 # different pointer means new memory was allocated
julia> a .+= a
3-element Vector{Int64}:
4
8
12
julia> pointer(a)
Ptr{Int64} @0x00007fa02a06eac0 # same pointer means memory re-use
这不是一个答案,我同意克里斯托弗的回答,但请注意,在您链接的答案中,问题是数组被实例化为
Array[]
,这意味着它们没有类型。在您的例子中,zero(M,M,M,M)
返回一个数组{Float64,4}
,因此是一个包含Float64
(类型化)元素的四维数组。当N占主导地位,且M很小时,您可以通过创建一个randn(M^4*N)
数组并查看其重塑部分来节省一些时间。但是当M达到任何非小的大小时,rand
将占主导地位。我发布的示例代码只是一个具有相同代码结构的示例,我对生成和求和随机数不感兴趣:)换句话说,我的问题是:是否有比数组{Float,N}更好的变量类型来执行操作(例如张量乘以标量…)或对内存有“更好的访问”的?