AxisArrays.jl icon indicating copy to clipboard operation
AxisArrays.jl copied to clipboard

Axes are copied when taking a view

Open kcajf opened this issue 6 years ago • 2 comments

Having looked at the source code it is clear that when taking a view of an AxisArray, the indexed axes might be copied if _new_axes is called (https://github.com/JuliaArrays/AxisArrays.jl/blob/master/src/indexing.jl#L80). Is this the intended behaviour? It would make more sense to me for views to be taken of the original axes as well, to aid performance.

Example below (there is 16KB of allocation - i.e. the index copy)

using Dates
using AxisArrays
using BenchmarkTools

index = collect(DateTime(2018, 1, 1):Minute(1):DateTime(2018, 1, 10))
B = AxisArray(randn(Float64, (length(index), 10)), index)

@btime view(B, 1000:3000, :)
# 994.800 ns (6 allocations: 15.98 KiB)

If this should be fixed / changed, I'm happy to give a PR a go.

kcajf avatar Sep 26 '18 21:09 kcajf

Does anyone strongly oppose this? I think it's important to somehow have the ability to avoid copying the axes, even if not via this syntax.

kcajf avatar Dec 12 '18 11:12 kcajf

In this example, do you need to call collect? If you skip the collect, presumably it's also fast and allocation-free?

But of course there may be cases where you can't use a range, and hence this seems like a reasonable idea. I'll comment over in #148.

timholy avatar Dec 12 '18 15:12 timholy