В чем разница между Array{Bool} и BitArray в Julia и как они связаны?
я писал функцию для булевых 2d-массивов:
function foo(A::Array{Bool,2})
...
end
оценка и тестирование с
A = randbool(3,3)
foo(A)
возвращает
ERROR: 'foo' has no method matching foo(::BitArray{2})
очевидно, randbool()
создает BitArray
, тогда как я предполагал randbool()
даст Array{Bool}
.
как Array{Bool}
и BitArray
связаны? Почему они оба существуют?
я могу написать foo()
таким образом, что он принимает оба типа ввода, используя один метод (так как я не вижу разница)?
1 ответов
An Array{Bool}
каждый true/false
значение Bool
, который представлен внутренне как UInt8
. Поэтому, если Ваш массив имеет N
элементы, потребуется N
байты для его хранения.
A BitArray
каждый true/false
значение как один бит ,причем (концептуально) 8 из них упакованы в один UInt8
. Следовательно, требуется только N/8
байт для хранения массива. А BitArray
также определены методы, которые обрабатывают все необходимые битовые операции для вы.
в зависимости от операции, BitArray
s иногда медленнее, чем соответствующий Array{Bool}
, а иногда и быстрее. Но по большому счету различия в производительности довольно малы, поэтому имеет смысл использовать BitArray
С, Если у вас нет особых причин не делать этого. Но в целом они довольно взаимозаменяемы.
обратите внимание, что оба являются подтипами AbstractArray{Bool}
:
julia> BitArray <: AbstractArray{Bool}
true
julia> Array{Bool} <: AbstractArray{Bool}
true
это позволяет легко писать общие методы, которые принимают либо один.