问题:如何使用Julia 检查变量的大小(以字节为单位)?
我试过的:在Matlab中,whos()函数提供了这个信息,但在Julia中只提供了变量名和模块.在Julia手册中浏览标准库sizeof()看起来很有希望,但它似乎只提供规范二进制表示的大小,而不是当前变量.
waT*_*eim 11
返回数组大小乘以元素大小.
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)
返回块; 每个块是8个字节,因此最多可以表示64位
julia> x = BitArray(36);
julia> sizeof(x)
8
julia> x = BitArray(65);
julia> sizeof(x)
16
Run Code Online (Sandbox Code Playgroud)
返回字符串中的字符数(1个字节/字符).
julia> sizeof("hello world")
11
Run Code Online (Sandbox Code Playgroud)
与上面相同,但分别有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)
对于布局更复杂和/或不连续的情况.这是一个函数,它将迭代变量的字段(如果有的话)并返回所有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
它还包括结构的开销,如示例中所示。
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)
但是,应该小心,因为该函数是非导出的,并且可能不是未来的证明
在 Julia 1.6 中,varinfo()显示尺寸:
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\nRun Code Online (Sandbox Code Playgroud)\n对于特定变量,可以使用模式匹配(r"..."是 正则表达式):
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}\nRun Code Online (Sandbox Code Playgroud)\n或者将 Korbinian 的答案与Base.summarysize以下内容结合起来:Base.format_bytes
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"\nRun Code Online (Sandbox Code Playgroud)\n编辑:请注意至少在 1.5.3 和 1.6.1 中summarysize存在错误。varinfo也受到了影响。它已修复(用 测试1.7.3)。