NamedTuple类型不稳定,还是我用法不对?
各位大佬帮忙看个问题,我想定义一个可接受多个参数的NamedTuple类型,但始终做不好
pm::NamedTuple{(:b, ),Tuple{Int64}} #这样定义速度很快,但只能接受一个参数
pm::NamedTuple{names,T} where {names, T <: Tuple{Vararg{Int64}}}#这样可以接受多个参数,但速度很慢
pm::NamedTuple{names,T} where {names, T <: Tuple}}#这样可以接受多个参数,但速度很慢,并且还会多出很多额外的内存分配 5.762435 seconds (100.00 M allocations: 1.490 GiB, 0.83% gc time)
g.pm=(b=3,a=1,c=2) 这里就是多个参数的情况
我不知道是哪里错了,是NamedTuple定义类型不对,还是使用方法不对?,或者有没有其它的类可以替带NamedTuple?
帮忙看看,谢谢了
下面是代码
mutable struct TGlblvar
#pm::NamedTuple{(:b, ),Tuple{Int64}} #这样很快
#pm::NamedTuple{names,T} where {names, T <: Tuple{Vararg{Int64}}}#这样内存没多占用,但慢
pm::NamedTuple{names,T} where {names, T <: Tuple} #又慢又占内存
#pm::NamedTuple{names} where names #这样没报错,但慢
#pm::NamedTuple{(:b, )}#这样没报错,但慢
#pm::NamedTuple{(:b, ),Tuple{Any}} ##这样没报错,但慢
#pm::NamedTuple{names,Tuple{Vararg{Int64}}} where names
#pm::NamedTuple{names,Tuple{Int64,Int64}} where names #这样内存没多占用,但慢
#pm::NamedTuple{names,T} where {names, T <: Tuple{Int64,Int64}}
#pm::NamedTuple{names,T} where {names<:Vararg{Symbol}, T <: Tuple{Vararg{Int64}}}
#pm::NamedTuple{(:b, ),T} where {T <: Tuple{Int64}}
#pm::NamedTuple{<:Any, <:Tuple{Vararg{Int64}}}
function TGlblvar()
return new()
end
end
function test()
g=TGlblvar()
g.pm=(b=3,)
cc = 0
nt=g.pm
for i = 1:10^8
cc = cc + nt.b
end
println(g.pm, cc)
end
function ttt()
@time test()
#@code_warntype test()
#@code_typed test()
end
ttt()