Julia JIT 编译器为在 REPL 中调用的每个唯一函数签名编译单独版本的泛型函数。例如,如果foo
定义为
foo(x, y) = (x * y) ^ 2
Run Code Online (Sandbox Code Playgroud)
然后调用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)
Run Code Online (Sandbox Code Playgroud)
在某些情况下,专业化不是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, ::Int64), #undef, #undef, #undef, #undef, #undef, #undef)
Run Code Online (Sandbox Code Playgroud)