例如a[1,1]和a[:,1]有些区别,在使用的好像后者要慢一些
可以用 @time
看
julia> a = rand(2,2)
2×2 Array{Float64,2}:
0.0267524 0.691183
0.674876 0.729643
julia> @time a[1,1]
0.000002 seconds (5 allocations: 176 bytes)
0.026752448940208895
julia> @time a[:,1]
0.000007 seconds (6 allocations: 272 bytes)
2-element Array{Float64,1}:
0.026752448940208895
0.6748763817412906
julia> @time a[1,:]
0.032593 seconds (72.49 k allocations: 3.573 MiB, 10.32% gc time)
2-element Array{Float64,1}:
0.026752448940208895
0.6911830907916054
当然示例中的 a
很小,不一定会出现像最后那样的 gc
关于 gc time 详见 Timing in Julia – pkofod
from —— julia代码执行时间gc time优化要合理,这是一个失败的案例
假设a是从1开始的矩阵, a[1,1]
得到矩阵的1,1元素, a[:, 1]
得到矩阵第一列. 不过这个速度差别不是因为GC.
如果你说的是这种情况的话,
julia> using BenchmarkTools
julia> a = zeros()
0-dimensional Array{Float64,0}:
0.0
julia> @btime a[1,1]
20.874 ns (1 allocation: 16 bytes)
0.0
julia> @btime a[:,1]
435.813 ns (2 allocations: 112 bytes)
1-element Array{Float64,1}:
0.0
julia> g(a, i) = a[:, i]
g (generic function with 1 method)
julia> @btime @inbounds g($a, 1)
40.052 ns (1 allocation: 96 bytes)
1-element Array{Float64,1}:
0.0
那是因为Julia认为 a[:, 1]
要有个循环, 但 a[1,1]
直接读取元素.