Using `append!` instead of `push!` and letting efficient dynamic 
reallocation of vector do the resizing:

function vcat_nosplat2a(y)
    result = Array(eltype(y[1]), 0)
    for a in y
        append!(result, a)
    end
    result
end

(@benchmark shows way less allocations and 2-3x time)
BTW the splat version is just as quick, but perhaps allocation on stack is 
problematic (anybody check the limit?)

On Monday, November 23, 2015 at 12:07:18 PM UTC+2, Tomas Lycken wrote:
>
> That doesn’t quite seem to do what you want, Mauro:
>
> julia> arr_of_arr = Vector{Int}[[1],[2,3],[4,5]]
> 3-element Array{Array{Int64,1},1}:
>  [1]
>  [2,3]
>  [4,5]
>
> julia> vcat_nosplat(y) = eltype(y[1])[el[1] for el in y]
> vcat_nosplat (generic function with 1 method)
>
> julia> vcat_nosplat(arr_of_arr)
> 3-element Array{Int64,1}:
>  1
>  2
>  4
>
> It’s quite trivial to achieve the desired result with only a few lines of 
> code, though:
>
> julia> function vcat_nosplat2(y)
>        result = Array(eltype(y[1]), 0)
>        sizehint!(result, sum(map(length, y))) #skip if iterating is more 
> expensive than reallcoation
>
>        for a in y
>            for x in a
>                push!(result, x)
>            end
>        end
>
>        result
>        end
> vcat_nosplat2 (generic function with 1 method)
>
> julia> vcat_nosplat2(arr_of_arr)
> 5-element Array{Int64,1}:
>  1
>  2
>  3
>  4
>  5
>
> // T
>
> On Sunday, November 22, 2015 at 9:12:55 PM UTC+1, Mauro wrote:
>
> In ODE.jl, I've used 
>>
>> vcat_nosplat(y) = eltype(y[1])[el[1] for el in y] # Does vcat(y...) 
>> without the splatting 
>>
>> I think the eltype might not be needed.  There may be better ways though. 
>>
>> On Sun, 2015-11-22 at 14:04, Cedric St-Jean <[email protected]> wrote: 
>> > I have a big vector of vectors. Is there any way to vcat/hcat them 
>> without 
>> > splatting? 
>> > 
>> > arr_of_arr = Vector[[1],[2,3],[4,5]] 
>> > vcat(arr_of_arr...) 
>> > 
>> > I'm asking because splatting big arrays is a performance issue (and 
>> IIRC it 
>> > blows the stack at some point). 
>>
> ​
>

Reply via email to