使用Julia检查变量的大小(以字节为单位)

Col*_*ers 6 julia

问题:如何使用Julia 检查变量的大小(以字节单位)

我试过的:在Matlab中,whos()函数提供了这个信息,但在Julia中只提供了变量名和模块.在Julia手册中浏览标准库sizeof()看起来很有希望,但它似乎只提供规范二进制表示的大小,而不是当前变量.

waT*_*eim 11

sizeof也适用于变量

的sizeof(A ::阵列{T,N})

返回数组大小乘以元素大小.

julia> x = [1 2 3 4]
1x4 Array{Int64,2}:
 1  2  3  4

julia> sizeof(x)
32

julia> x = Int8[1 2 3 4]
1x4 Array{Int8,2}:
 1  2  3  4

julia> sizeof(x)
4
Run Code Online (Sandbox Code Playgroud)

的sizeof(B :: BitArray {N})

返回块; 每个块是8个字节,因此最多可以表示64位

julia> x = BitArray(36);
julia> sizeof(x)
8 

julia> x = BitArray(65);
julia> sizeof(x)
16
Run Code Online (Sandbox Code Playgroud)

sizeof(s :: ASCIIString)sizeof(s :: UTF8String)

返回字符串中的字符数(1个字节/字符).

julia> sizeof("hello world")
11
Run Code Online (Sandbox Code Playgroud)

sizeof(s :: UTF16String)sizeof(s :: UTF32String)

与上面相同,但分别有2和4个字节/字符.

julia> x = utf32("abcd");
julia> sizeof(x)
16
Run Code Online (Sandbox Code Playgroud)

因此其他字符串

sizeof(s::SubString{ASCIIString}) at string.jl:590
sizeof(s::SubString{UTF8String}) at string.jl:591
sizeof(s::RepString) at string.jl:690
sizeof(s::RevString{T<:AbstractString}) at string.jl:737
sizeof(s::RopeString) at string.jl:802
sizeof(s::AbstractString) at string.jl:71
Run Code Online (Sandbox Code Playgroud)

核心价值

返回每个变量使用的字节数

julia> x = Int64(0);
julia> sizeof(x)
8

julia> x = Int8(0);
julia> sizeof(x)
1

julia> x = Float16(0);
julia> sizeof(x)
2

julia> x = sizeof(Float64)
8
Run Code Online (Sandbox Code Playgroud)

人们会期待,但请注意朱莉娅角色是宽字符

julia> sizeof('a')
4
Run Code Online (Sandbox Code Playgroud)

的getBytes

对于布局更复杂和/或不连续的情况.这是一个函数,它将迭代变量的字段(如果有的话)并返回所有sizeof结果的总和,这应该是分配的总字节数.

getBytes(x::DataType) = sizeof(x);

function getBytes(x)
   total = 0;
   fieldNames = fieldnames(typeof(x));
   if fieldNames == []
      return sizeof(x);
   else
     for fieldName in fieldNames
        total += getBytes(getfield(x,fieldName));
     end
     return total;
   end
end
Run Code Online (Sandbox Code Playgroud)

使用它

创建一个随机类型的实例......

julia> type X a::Vector{Int64}; b::Date end

julia> x = X([i for i = 1:50],now())
X([1,2,3,4,5,6,7,8,9,10  …  41,42,43,44,45,46,47,48,49,50],2015-02-09)

julia> getBytes(x)
408
Run Code Online (Sandbox Code Playgroud)


小智 9

函数Base.summarysize正好提供了

它还包括结构的开销,如示例中所示。

julia> struct Foo a; b end

julia> Base.summarysize(ones(10000))
80040

julia> Base.summarysize(Foo(ones(10000), 1))
80064

julia> Base.summarysize(Foo(ones(10000), Foo(ones(10, 10), 1)))
80920
Run Code Online (Sandbox Code Playgroud)

但是,应该小心,因为该函数是非导出的,并且可能不是未来的证明


ede*_*rag 6

在 Julia 1.6 中,varinfo()显示尺寸:

\n
julia> a = 1;\njulia> v = ones(10000);\njulia> varinfo()\n  name                    size summary                      \n  \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\n  Base                         Module                       \n  Core                         Module                       \n  InteractiveUtils 250.022 KiB Module                       \n  Main                         Module                       \n  ans               78.164 KiB 10000-element Vector{Float64}\n  v                 78.164 KiB 10000-element Vector{Float64}\n  a                    8 bytes Int64\n
Run Code Online (Sandbox Code Playgroud)\n

对于特定变量,可以使用模式匹配(r"..."正则表达式):

\n
julia> varinfo(r"^v$")\n  name       size summary                      \n  \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93 \xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\xe2\x80\x93\n  v    78.164 KiB 10000-element Vector{Float64}\n
Run Code Online (Sandbox Code Playgroud)\n

或者将 Korbinian 的答案Base.summarysize以下内容结合起来:Base.format_bytes

\n
julia> pretty_summarysize(x) = Base.format_bytes(Base.summarysize(x))\npretty_summarysize (generic function with 1 method)\n\njulia> pretty_summarysize(v)\n"78.164 KiB"\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:请注意至少在 1.5.3 和 1.6.1 中summarysize存在错误。varinfo也受到了影响。它已修复(用 测试1.7.3)。

\n