使用 Julia 检查变量的字节大小
Check size in bytes of variable using Julia
问题:如何使用 Julia 检查变量的大小字节?
我试过的: 在 Matlab 中,whos()
函数提供了这些信息,但在 Julia 中,它只提供了变量名和模块。浏览 Julia 手册中的标准库,sizeof()
看起来很有希望,但它似乎只提供 canonical 二进制表示的大小,而不是当前变量。
sizeof 也适用于变量
sizeof(a::Array{T,N})
returns 数组大小乘以元素大小。
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
sizeof(B::BitArray{N})
returns 个块;每个块是 8 个字节,因此最多可以表示 64 位
julia> x = BitArray(36);
julia> sizeof(x)
8
julia> x = BitArray(65);
julia> sizeof(x)
16
sizeof(s::ASCIIString) and sizeof(s::UTF8String)
return字符串中的字符数(1byte/char).
julia> sizeof("hello world")
11
sizeof(s::UTF16String) and sizeof(s::UTF32String)
与上面相同,但分别为 2 和 4 bytes/character。
julia> x = utf32("abcd");
julia> sizeof(x)
16
据此其他strings
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
core values
returns 每个变量使用的字节数
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
有人会预料到,但请注意 Julia 字符是宽字符
julia> sizeof('a')
4
getBytes
对于布局更复杂的情况 and/or 不连续。这是一个函数,它将遍历变量的字段(如果有的话)和所有 sizeof 结果之和的 return,这应该是分配的字节总数。
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
使用它
创建一个随机类型的实例...
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
函数 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
但是,应注意该函数未导出,可能不会面向未来
在 julia 1.6 中,varinfo()
显示尺寸:
julia> a = 1;
julia> v = ones(10000);
julia> varinfo()
name size summary
–––––––––––––––– ––––––––––– –––––––––––––––––––––––––––––
Base Module
Core Module
InteractiveUtils 250.022 KiB Module
Main Module
ans 78.164 KiB 10000-element Vector{Float64}
v 78.164 KiB 10000-element Vector{Float64}
a 8 bytes Int64
对于特定的变量,要么使用模式匹配(r"..."
是一个regular expression):
julia> varinfo(r"^v$")
name size summary
–––– –––––––––– –––––––––––––––––––––––––––––
v 78.164 KiB 10000-element Vector{Float64}
或组合 Base.summarysize
from with Base.format_bytes
:
julia> pretty_summarysize(x) = Base.format_bytes(Base.summarysize(x))
pretty_summarysize (generic function with 1 method)
julia> pretty_summarysize(v)
"78.164 KiB"
编辑:请注意 summarysize
有一个 bug,至少在 1.5.3 和 1.6.1 中是这样。 varinfo
也受到了影响。它是固定的(用 1.7.3
测试)。
问题:如何使用 Julia 检查变量的大小字节?
我试过的: 在 Matlab 中,whos()
函数提供了这些信息,但在 Julia 中,它只提供了变量名和模块。浏览 Julia 手册中的标准库,sizeof()
看起来很有希望,但它似乎只提供 canonical 二进制表示的大小,而不是当前变量。
sizeof 也适用于变量
sizeof(a::Array{T,N})
returns 数组大小乘以元素大小。
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
sizeof(B::BitArray{N})
returns 个块;每个块是 8 个字节,因此最多可以表示 64 位
julia> x = BitArray(36);
julia> sizeof(x)
8
julia> x = BitArray(65);
julia> sizeof(x)
16
sizeof(s::ASCIIString) and sizeof(s::UTF8String)
return字符串中的字符数(1byte/char).
julia> sizeof("hello world")
11
sizeof(s::UTF16String) and sizeof(s::UTF32String)
与上面相同,但分别为 2 和 4 bytes/character。
julia> x = utf32("abcd");
julia> sizeof(x)
16
据此其他strings
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
core values
returns 每个变量使用的字节数
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
有人会预料到,但请注意 Julia 字符是宽字符
julia> sizeof('a')
4
getBytes
对于布局更复杂的情况 and/or 不连续。这是一个函数,它将遍历变量的字段(如果有的话)和所有 sizeof 结果之和的 return,这应该是分配的字节总数。
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
使用它
创建一个随机类型的实例...
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
函数 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
但是,应注意该函数未导出,可能不会面向未来
在 julia 1.6 中,varinfo()
显示尺寸:
julia> a = 1;
julia> v = ones(10000);
julia> varinfo()
name size summary
–––––––––––––––– ––––––––––– –––––––––––––––––––––––––––––
Base Module
Core Module
InteractiveUtils 250.022 KiB Module
Main Module
ans 78.164 KiB 10000-element Vector{Float64}
v 78.164 KiB 10000-element Vector{Float64}
a 8 bytes Int64
对于特定的变量,要么使用模式匹配(r"..."
是一个regular expression):
julia> varinfo(r"^v$")
name size summary
–––– –––––––––– –––––––––––––––––––––––––––––
v 78.164 KiB 10000-element Vector{Float64}
或组合 Base.summarysize
from Base.format_bytes
:
julia> pretty_summarysize(x) = Base.format_bytes(Base.summarysize(x))
pretty_summarysize (generic function with 1 method)
julia> pretty_summarysize(v)
"78.164 KiB"
编辑:请注意 summarysize
有一个 bug,至少在 1.5.3 和 1.6.1 中是这样。 varinfo
也受到了影响。它是固定的(用 1.7.3
测试)。