如何解决获取为通用函数编译的所有函数签名的列表
Julia JIT编译器针对在REPL中调用的每个唯一函数签名分别编译通用函数的不同版本。例如,如果foo
被定义为
foo(x,y) = (x * y) ^ 2
然后调用foo(2,3)
和foo("a","b")
将编译foo
的两个不同版本,分别对应于签名foo(::Int,::Int)
和foo(::String,::String)
。有没有办法获取为通用函数编译的不同函数签名的列表?
我了解methods
函数,但是methods
仅列出了程序员编写的通用函数的方法。而且,当然,如上面的foo
示例所示,程序员编写的一种方法可以产生许多单独的编译函数。
我只是出于教育目的而问这个。我没有任何代码打算使用假设的函数的结果来显示所有已编译的函数签名。
解决方法
MethodAnalysis软件包提供了用于此目的的工具以及更多其他工具。例如:
julia> foo(x,y) = (x * y) ^ 2
foo (generic function with 1 method)
julia> foo(1,1); foo(1.0,1);
julia> using MethodAnalysis
julia> methodinstances(foo)
2-element Vector{Core.MethodInstance}:
MethodInstance for foo(::Int64,::Int64)
MethodInstance for foo(::Float64,::Int64)
在某些情况下,专业不是svec
,methodinstances
使以易于访问的格式收集它们变得更加简单。
也许有更好的方法,但是可以肯定的是:
julia> foo(1,1);
julia> foo(1.0,1);
julia> typeof(foo).name.mt.defs.func.specializations
svec(MethodInstance for foo(::Int64,::Int64),MethodInstance for foo(::Float64,#undef,#undef)
,
只需确保在这里提到它即可
还有一个名为LookingGlass.jl的软件包,它与MethodAnalysis.jl非常相似,并且也为此提供了一个功能:
julia> foo(x,1);
julia> using LookingGlass
julia> LookingGlass.func_specializations(foo)
Dict{Core.MethodInstance,Method} with 2 entries:
MethodInstance for foo(::Float64,::Int64) => foo(x,y) in Main at REPL[4]:1
MethodInstance for foo(::Int64,::Int64) => foo(x,y) in Main at REPL[4]:1
我想将LookingGlass.jl与MethodAnalysis.jl合并很长时间,但总是很忙。 ?
LookingGlass还有其他用于模块,功能和方法的运行时反射分析工具,但我认为MethodAnalysis中针对此任务的实现更为健壮,因此@tholy的答案可能是最好的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。