Эффективность типа: Array {Int64, 1} VERSUS LinearAlgebra.Adjoint {Int64, Array {Int64, 1}} - PullRequest
0 голосов
/ 23 мая 2019

Отредактировано для ясности!

Существует несколько способов создания / генерации массива в Julia.

Я использовал одинарную кавычку или апострофный подход для векторов столбцов, потому что это быстрее, чем множественные запятые в []:

julia> a = [1 2 3 4]'
4×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 1
 2
 3
 4

Это генерирует, как мне кажется, более сложный тип данных: "LinearAlgebra.Adjoint {Int64, Array {Int64,1}}" *

По сравнению с запятыми:

julia> a = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4

, который генерирует тип Array {Int64,1}.

Вопрос (ы):

Является ли тип LinearAlgebra.Adjoint {...} более вычислительно дорогим, чем базовый массив? Следует ли мне избегать генерации этого массива в общем смысле? (Т.е. вне моделирования линейной алгебры)

Возможно, есть небольшая разница, которая не будет иметь значения при меньшем объеме, но я планирую в конечном итоге выполнить операции с большими наборами данных. Должен ли я поддерживать согласованность с генерацией их в виде Array {Int64,1} типов для этих целей?


Оригинал

Я изучал Юлию и хотел бы развить хорошие привычки рано; сосредоточив внимание на вычислительной эффективности. Я работал с массивами и освоился с одинарной кавычкой в ​​конце для преобразования в вектор-столбец. Из того, что я понимаю о системе типов, это не просто более быстрый вариант организации, чем запятая. Является ли использование запятой в вычислительном отношении более дорогим или семантически нежелательным в целом? Кажется, это не имеет значения для меньших наборов данных, но как насчет больших наборов данных (например, 10k вычислений)

Deleted original code example to avoid confusion.

1 Ответ

1 голос
/ 24 мая 2019

Вот пример производительности:

julia> a = rand(10^6);

julia> b = rand(1, 10^6)';

julia> typeof(a)
Array{Float64,1}

julia> typeof(b)
Adjoint{Float64,Array{Float64,2}}

julia> @btime sum($a)
  270.137 μs (0 allocations: 0 bytes)
500428.44363296847

julia> @btime sum($b)
  1.710 ms (0 allocations: 0 bytes)
500254.2267732659

Как видите, производительность суммы за Vector намного лучше, чем сумма за Adjoint (на самом деле я немногоудивляешься, насколько велика разница).

Но для меня большая причина использовать Vector в том, что использование сложного и запутанного типа Adjoint кажется странным и неестественным.Также гораздо больший риск того, что некоторый код не примет Adjoint, и тогда вы просто создаете дополнительные проблемы для себя.

Но, на самом деле, почему вы хотите использовать Adjoint?Это просто чтобы не писать в запятых?Как долго эти векторы вы печатаете?Если векторная типизация для вас очень большая неприятность, вы можете написать [1 2 3 4][:], которая вернет Vector.Это также вызовет дополнительное выделение и копирование, и это выглядит странно, но если это очень важно для вас, возможно, оно того стоит.

Мой совет: введите запятые.

...