NamedTuple类型不稳定,还是我用法不对?

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()

你可能需要看下:

https://docs.juliacn.com/latest/manual/constructors/#参数类型的构造函数

https://docs.juliacn.com/latest/manual/performance-tips/#类型声明

楼上+1

struct TGlblvar{NAMES, T}
    pm::NamedTuple{NAMES, T}
end

把它设置成mutable没有意义,需要修改的话直接新建一个对象就好了,因为这里并不会创建新的数据,只是对原有的NamedTuple数据进行一层简单的封装。

感谢两位的回答。
抱歉,可能是我没有描述清楚。
一是这个TGlblvar变量有很多个字段,不仅仅只有pm一个字段。
二是在创建TGlblvar这个的时候,pm不会一起创建,并且此时也不知道pm的类型。pm的类型和有几个参数是后期根据业务情况来创建的

这个特点不就决定了它的类型不会稳定么?

感觉这个包应该能完美解决我的问题。先放上来明天来试一下性能如何。