Tim Holyから提供されているMappedArrayパッケージがあります。それによって、次のように目やプロセッサ上で簡単に次のようになります。いつものように
julia> using MappedArrays
julia> struct Point
x::Float64
y::Float64
end
julia> pvec = [Point(rand(),rand()) for i=1:10];
julia> b = mappedarray(e->e.x,pvec);
julia> b[3]
0.9524214421389912
julia> b
10-element MappedArrays.ReadonlyMappedArray{Float64,1,Array{Point,1},##3#4}:
0.383683
0.474853
0.952421
0.388564
0.268427
0.301026
0.117767
0.712266
0.629364
0.227822
、パフォーマンスが明示的に測定しなければならないが、物事が正しくインライン化得ればOKでなければなりません。タプルのベクトルの
UPDATE
はmappedarray(e->first(e),tvec)
および変形あろう。たとえば、次のように
julia> tvec = [(rand(),rand()) for i=1:10000];
julia> c = mappedarray(x->first(x),tvec);
julia> c[5]
0.8626336507168362
そしてキッカーはあるが、判明sum(c)
は速いです:
julia> @btime sum(first.(tvec))
21.643 μs (25 allocations: 79.23 KiB)
5000.93749585252
julia> @btime sum(c)
9.850 μs (1 allocation: 16 bytes)
5000.937495852521
julia> @btime sum(first(x) for x in tvec)
10.560 μs (2 allocations: 32 bytes)
5000.937495852521
裸の内包表記が悪いのでしょうか? 'av = [i [p] in i for i]' – Gnimuc
これは配列のN回のパスを必要とし、それほどかわいく見えない以外は何もありません:-) –