Julia 可以优化布尔数组的内存吗?

Mic*_* M. 3 memory arrays boolean julia

在 Julia 和我能想到的所有其他语言中,布尔值占用 8 位内存,否则它将无法在内存中寻址。例如:

x = true
println(sizeof(x)) # => 1
Run Code Online (Sandbox Code Playgroud)

但是,当我创建布尔数组时,每个元素仍然占用整个字节:

x = [true, false, true, false, true, true, false, false]
println(sizeof(x)) # => 8
Run Code Online (Sandbox Code Playgroud)

在其他语言中,例如 C++,八个布尔值的数组仅占用 1 个字节,因为每个布尔值实际上只需要 1 位。是否有可能让 Julia 也像这样优化布尔数组,以便我可以节省内存?如果是这样,怎么办?

Dan*_*etz 5

是的,Julia 可以优化布尔向量的内存。使用 BitVector 类型(和 BitArray 类型)。例如:

julia> bv = BitVector(rand(Bool, 1_000));

julia> size(bv)
(1000,)

julia> sizeof(bv)
128
Run Code Online (Sandbox Code Playgroud)

支持所有标准布尔运算。

文档链接是:https://docs.julialang.org/en/v1/base/arrays/#Base.BitArray

?REPL中的帮助模式也给出了关于BitVector的简短描述。

补充:DNF正确指出:

julia> using Random

julia> bv = bitrand(1_000);
Run Code Online (Sandbox Code Playgroud)

将是创建随机位向量的有效方法。

  • 这是正确的,但您应该使用“bitrand(1_000)”,而不是绕道“BitVector(rand(Bool, 1_000))”,因为后者会慢得多,并创建不必要的大临时数组。 (3认同)